【问题标题】:Bash Conditional Quote in String字符串中的 Bash 条件引号
【发布时间】:2015-01-02 13:06:53
【问题描述】:

我有一个在 bash 中解析的 CSV 文件,对于一列,对于某些行有多个值。 例如,具有多个值的行可能看起来像

name,12,120,east,"sw1,sw2,sw3"

但并非所有行都有它。有些可能看起来像

name,10,141,west,sw5534a

我想要做的是,如果该列中有引号以删除它们并将变量设置为 sw1,sw2,sw3

脚本的相关部分:

#!/bin/bash
INPUT=file.csv
OLDIFS=$IFS
IFS=,
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read name building id region parents
do
echo "
....snip....
parents $parents"

我想要 $parents 的输出应该是 sw1,sw2,sw3 但现在它输出为 "sw1,sw2,sw3" 如果列有逗号来删除第一个和最后两个字符,我已经尝试在条件中搞乱正则表达式匹配,但我无法让它工作。要么它会删除第一个 s 和最后一个 3,要么只会出错。

任何建议表示赞赏!

【问题讨论】:

  • 你能不能只做:sed 's/"//g' file.csv
  • 文件中的其他字段可以这样引用吗?
  • @Barmar:我不同意您将此问题标记为重复问题。另一个问题是关于 awk,而不是 bash。
  • 这是关于使用awk 解析bash 脚本中的CSV 文件。我不认为您可以仅使用 bash 正确地做到这一点。
  • 附带问题:您可以在本地为 read 语句设置 IFS。这避免了必须保存和恢复它,也避免了它可能在 while 循环主体内进行的任何交互:while IFS=, read name building id region parents。此外,您实际上总是希望将-r 标志提供给read

标签: regex bash conditional


【解决方案1】:

您可以使用子字符串替换删除$parents 变量中" 字符的两个实例:

echo ${parents//\"/}

这会将所有" 字符替换为空字符串。

【讨论】:

  • 这有什么帮助?我们的想法是将其视为一个字段,因为它已被引用。
  • 效果很好!多谢! (不会让我再接受你的回答 3 分钟,但到那时我会接受)
  • @Barmar:阅读问题。他希望使用 bash 构造删除字段值中的双引号字符。我的代码就是这样做的。
  • 抱歉,误读了,我以为您在阅读之前将它们从行中删除了。
  • 虽然如果 CSV 中有任何其他字段包含逗号,read 语句会将错误的字段放入parents
【解决方案2】:
parents="${parents#\"}"
parents="${parents%\"}"

如果是引号,这将删除第一个字符,如果是引号,则删除最后一个字符。如果它们不是引用,它们将保持不变。

【讨论】:

  • 不错,但是 { } 内的 " 需要转义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
相关资源
最近更新 更多