【问题标题】:escape delimiter between date fileds while using sed使用 sed 时在日期字段之间转义分隔符
【发布时间】:2019-07-23 12:32:21
【问题描述】:

我正在尝试在包含日期、空值、带有管道分隔符的字符串的文本上使用 sed 删除引号中的分隔符 |。我使用了以下 sed 它的工作正常,但它删除了日期之间的分隔符。任何帮助将不胜感激。

sed -E 's/(^|[^"|])\|($|[^"|])/\1 \2/g' <file>

输入:

"Southern|Palms"|"AA|None"|"4"|"Ken|Coast"|1/11/2019 00:00:00|30/4/2020 00:00:00|"TH"|

返回:

"Southern Palms"|"AA None"|"4"|"Ken Coast"|1/11/2019 00:00:00 30/4/2020 00:00:00|"TH"|

预期输出:
"Southern Palms"|"AA None"|"4"|"Ken Coast"|1/11/2019 00:00:00|30/4/2020 00:00:00|"TH"|

【问题讨论】:

    标签: linux unix awk sed


    【解决方案1】:

    使用 GNU awk 进行 FPAT:

    $ awk -v FPAT='[^|]*|"[^"]+"' -v OFS='|' '{for (i=1;i<=NF;i++) gsub(/\|+/," ",$i)} 1' file
    "Southern Palms"|"AA None"|"4"|"Ken Coast"|1/11/2019 00:00:00|30/4/2020 00:00:00|"TH"|
    

    What's the most robust way to efficiently parse CSV using awk?

    【讨论】:

    • 我在 awk 上试过,但它用分隔符“UK|&|I”“KEKE0006”“Southern Palms Beach|Resort”“AA|None”“4”“Kenya”“MBA”“替换空格肯尼亚|海岸” “Y” 1/11/2019|00:00:00 30/4/2020|00:00:00
    • 它完全符合您的要求。如果您看到意外的输出,那么您要么复制/粘贴了错误的脚本,要么您的真实输入看起来不像您的预期输出,或者您没有运行 gawk。运行awk --version 告诉你什么?
    • 它有 GNU Awk 3.1.7
    • 这是 FPAT 之前的 非常 过时的 gawk 版本(已过时 5 年以上)。我们目前在 gawk 5.0.2 - 你能更新你的版本吗?您缺少大量非常有用的功能和一些错误修复。
    【解决方案2】:

    怎么样:

    sed -E 's/(\w+)\|(\w+)/\1 \2/g' testfile.txt
    

    \w+\|\w+ 匹配像&lt;word1&gt;|&lt;word2&gt; 这样的两个单词之间的管道符号,并将其替换为像这样&lt;word1&gt; &lt;word2&gt; 以空格分隔的两个单词

    如果要匹配引号,请使用:

    sed -E 's/("\w+)\|(\w+")/\1 \2/g' testfile.txt
    

    匹配 "&lt;word1&gt;|&lt;word2&gt;" 并将其替换为 "&lt;word1&gt; &lt;word2&gt;"

    【讨论】:

    • 使用上述 sed 的日期字段之间缺少分隔符
    • @marjun 我用你提供的输入在我的 Linux 机器上运行了它,我得到了你所说的预期输出。顺便说一下,在模式中使用引号。
    • 它回答了我的商,如果在多个单词“Southern Palms|Beach Resort”之间有一个分隔符会怎样
    • 如果引号中有两个以上的单词,则会失败:"Southern|Palms|spring"|"AA|None"|"4"
    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 2011-12-02
    • 1970-01-01
    • 2021-07-10
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多