从输入中提取ID

时间:2017-11-03 08:35:55

标签: linux awk sed

我输入了

"ABC""XYZ""WER"

我想输出

ABC,XYZ,WER

我做了什么

 tr -d '"' 

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

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

它给了我错误sed:没有输入文件

如果写someThing就像

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

我得到了第6条:没有终结的`s'命令

7 个答案:

答案 0 :(得分:3)

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

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

sed的两个步骤:

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

答案 1 :(得分:3)

使用awk

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

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

使用gawk

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

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

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

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

1总是正确的,让awk最终打印出来。

答案 2 :(得分:2)

如果您grep支持-o选项

  

-o, - 仅匹配

     

仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出上                 线。

$ 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

答案 3 :(得分:1)

使用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

答案 4 :(得分:0)

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

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

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

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

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

输出:

ABC,XYZ,WER

答案 5 :(得分:0)

切割

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

答案 6 :(得分:0)

这可能适合你(GNU sed):

WHERE type_desc LIKE '%CONSTRAINT'

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