【问题标题】:Extract ids from input从输入中提取 id
【发布时间】:2017-11-04 17:55:31
【问题描述】:

我有类似的输入

"ABC""XYZ""WER"

我想要像

这样的输出
ABC,XYZ,WER

我做了什么

 tr -d '"' 

这将删除所有字符“,我想将“”替换为 ,并删除单个“。 输入是 grep 命令的输出,我正在将管道添加到 grep 的输出。

grep something. | sed -e 's/""//g'

它给了我错误 sed: no input files

如果写一些类似的东西

sed -i 's/""/g' file.txt

我得到 char 6: unterminated `s' command

【问题讨论】:

  • 不要盲目使用参数。删除 sed 的 i 参数。
  • 是的,明白了。因为这是不可能的流内联编辑。

标签: linux awk sed


【解决方案1】:

您可以使用以下sed 命令来执行此操作,

sed 's/""/,/g;s/"//g' <<<'"ABC""XYZ""WER"'

sed 的两个步骤:

  1. 将流中的每个"" 替换为,
  2. 在第 1 步之后,消除流中的单个 "

【讨论】:

  • 感谢您的解决方案。请解释一下。
  • 感谢您的解释。明白了
  • 最后,sed 看起来是适合这项工作的工具。 +1
【解决方案2】:

awk:

awk '{gsub(/""/,",");gsub(/"/,"")}1' file

gsub 用于正则表达式搜索和替换。第一个用, 替换"",第二个替换行首和行尾的"1 使 awk 打印该行。


gawk:

gawk 'BEGIN{FPAT="[^\"]+";OFS=","}{$1=$1}1' file

该命令是 gawk 特定的,因为我使用了 FPAT 特殊变量。它描述了输入中的 field 的样子。输入中的字段是一系列非双引号字符。

OFS 是我们想要设置为,输出字段分隔符

$1=$1 只是一个身份转换,但它使awk 使用新的输出分隔符, 重新渲染该行。

1 始终为真,让 awk 最终打印该行。

【讨论】:

    【解决方案3】:

    如果您有支持-o 选项的grep

    -o, --only-matching

    仅打印匹配行的匹配(非空)部分,每个这样的部分都在单独的输出中 行。

    $ echo '"ABC""XYZ""WER"' | grep -o '[^"]*'
    ABC
    XYZ
    WER
    
    $ echo '"ABC""XYZ""WER"' | grep -o '[^"]*' | paste -sd,
    ABC,XYZ,WER
    

    perl

    $ echo '"ABC""XYZ""WER"' | perl -lne 'print join ",", /[^"]+/g'
    ABC,XYZ,WER
    

    【讨论】:

      【解决方案4】:

      使用 GNU awk

      awk -v FPAT='"[^"]+"' '{ for(i=1;i<=NF;i++) 
             printf "%s%s",substr($i,2,length($i)-2),(i==NF? ORS:",") }' <<<'"ABC""XYZ""WER"'
      

      输出:

      ABC,XYZ,WER
      

      【讨论】:

        【解决方案5】:

        使用便携式 awk,您可以像这样替换字段分隔符:

        awk '$1=$1' FS='""' OFS=,
        

        这会将"" 替换为,$1=$1 位强制 awk 进行字段和记录拆分。

        所以要回答你的问题,你可以这样做:

        <<<'"ABC""XYZ""WER"'\
        awk '$1=$1' FS='""' OFS=, | tr -d \"
        

        输出:

        ABC,XYZ,WER
        

        【讨论】:

          【解决方案6】:

          带剪辑

          echo '"ABC""XYZ""WER"' | cut -d '"' -f 2,4,6 --output-delimiter=','
          

          【讨论】:

            【解决方案7】:

            这可能对你有用(GNU sed):

            sed -r 's/"([^"\\]*(\\.[^"\\]*)*)"/\1,/g;s/,$//' file
            

            这将替换用双引号括起来的字符串(包括可能被双引号括起来的引号字符)并将它们替换为仅后跟逗号的字符串。然后删除最后的逗号。

            【讨论】:

              猜你喜欢
              • 2023-03-27
              • 2014-11-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-08-17
              • 2021-07-22
              • 2010-12-13
              • 1970-01-01
              相关资源
              最近更新 更多