如何在文本文件 bash 中的逗号后为字符串的第二个元素添加引号

如何在文本文件 bash 中的逗号后为字符串的第二个元素添加引号

文件内容:

1234,/Product/number 234567
2456,/Product/number 456789

等等...很多行

希望输出如下:

1234,"/Product/number 234567"
2456,"/Product/number 456789"

答案1

对于结构化数据(即可以用以下方式描述的数据)记录由分隔的字段)我建议使用像 awk 这样的工具:

awk -F, 'BEGIN{OFS=FS} {$2 = "\"" $2 "\""} {print}' file

或(更紧凑 - 利用默认打印操作)

awk -F, 'BEGIN{OFS=FS} {$2 = "\"" $2 "\""} 1' file

如果你真的需要在 bash 中本地执行此操作,然后

while IFS=, read -r a b; do printf '%s,"%s"\n' "$a" "$b"; done < file

(但不要——看为什么使用 shell 循环来处理文本被认为是不好的做法?)。

答案2

您可以使用perl 正则表达式并且您可以用 替代类似的sed

假设您总是会/Product/number跟着一组数字,那么您可以使用以下命令来打印更改:

perl -pe 's|/Product/number (\d+)|"$&"|g' filename

如果对输出满意,可以使用以下命令编辑文件:

perl -pi -e 's|/Product/number (\d+)|"$&"|g' filename
  • (\d+)匹配任意一组一个或多个数字
  • $&反向引用整个匹配的字符串,类似于&使用sed

另外,我使用|作为分隔符而不是/因为字符串包含正斜杠。


或者,您可以使用sed以下命令来打印:
sed -Ee 's|/Product/number [[:digit:]]+|"&"|g' filenameme

或以下命令来实际编辑对文件的更改:

sed -Ei 's|/Product/number [[:digit:]]+|"&"|g' filenameme

此命令使用扩展​​正则表达式选项-E

  • [[:digit:]]+匹配一组一个或多个数字
  • &反向引用整个匹配的字符串

答案3

如果您的数据确实像您展示的那么简单,您只需在第一个逗号后和每行的最后一个字符后添加一个双引号字符。如果是这样,只需执行以下操作:

$ sed 's/,/,"/; s/$/"/' file
1234,"/Product/number 234567"
2456,"/Product/number 456789"

相关内容