【问题标题】:How to add double quotation marks ("") around pipe-separated fields [duplicate]如何在管道分隔的字段周围添加双引号(“”)[重复]
【发布时间】:2021-01-27 22:06:05
【问题描述】:

假设我有一个具有这种结构的文件:

1|2|3|4|
5|6|7|8|
9|10|11|12|

但是,我希望我的文件看起来像这样(预期输出):

"1"|"2"|"3"|"4"|
"5"|"6"|"7"|"8"|
"9"|"10"|"11"|"12"|

我正在尝试通过以下方式使用sed 命令:

sed 's/^/"/g'

不幸的是,它只在每行的开头添加了引号:

"1|2|3|4|
"5|6|7|8|
"9|10|11|12|

【问题讨论】:

    标签: bash sed command-line


    【解决方案1】:

    ^ 表示“一行的开头”。使用[^|] 代替,这意味着“除了| 之外的任何东西”。如果你的 sed 实现支持+,你可以使用

    sed -E 's/[^|]+/"&"/g'
    

    否则,你需要更详细

    sed  's/[^|][^|]*/"&"/g'
    

    &代表匹配的部分。

    【讨论】:

    • 可能你想在每个不是“|”的字符两边加上双引号
    【解决方案2】:

    你可以使用

    sed -E 's/[^|]+/"&"/g' file > newfile
    

    -E 选项启用 POSIX ERE 语法,因此[^|]+ 匹配除| 之外的一个或多个字符,"&" 将每个字符替换为两边都用" 括起来的副本。

    online sed demo

    s='1|2|3|4|
    5|6|7|8|
    9|10|11|12|'
    sed -E 's/[^|]+/"&"/g' <<< "$s"
    

    输出:

    "1"|"2"|"3"|"4"|
    "5"|"6"|"7"|"8"|
    "9"|"10"|"11"|"12"|
    

    【讨论】:

    • 这项工作非常好,但你知道如何将它应用到除第一行之外的每一行吗?
    • @brenda sed -E '2,$ s/[^|]+/"&amp;"/g' - 从第二行开始到最后一行。
    【解决方案3】:

    这是gnu awk 的相同方式:

    awk -v RS="[|\n]+" '{ORS=RT; print "\"" $0 "\""}' file
    
    "1"|"2"|"3"|"4"|
    "5"|"6"|"7"|"8"|
    "9"|"10"|"11"|"12"|
    

    【讨论】:

      猜你喜欢
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 2013-01-03
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多