如何替换管道分隔文件的一个字段中的内部双引号

如何替换管道分隔文件的一个字段中的内部双引号

我有一个 PSV 文件:

$ cat hello.txt 
123|"xy"|11|"sb" sri"|13|"bb" 
123|"xy"|11|"rss" "NIL"|13|"bb"   

在第四个字段中,我想用不同的字符 ( ) 替换内部双引号W

这是我尝试过的,但还没有达到我想要的效果。

$ sed '/"|/s/[^|]|/W|/4' hello.txt 
123|"xy"|11|"sb" sriW|13|"bb" 
123|"xy"|11|"rss" "NILW|13|"bb"  

我希望输出像hello.txt下面的文件中这样。

$ cat hello.txt 
123|"xy"|11|"sbW sri"|13|"bb" 
123|"xy"|11|"rssW WNIL"|13|"bb"

答案1

从不同的角度来看,

123|"xy"|11|"sb" sri"|13|"bb" 
123|"xy"|11|"rss" "NIL"|13|"bb"

您想要提取第四个管道分隔字段:

cut -f4 -d'|' < test

"sb" sri"
"rss" "NIL"

然后字段内可能有引号,所以去掉外面的对

cut -f4 -d'|' < test | sed -e 's/^"\(.*\)"/\1/g'

sb" sri
rss" "NIL

将所有剩余的引号替换为 W 符号

cut -f4 -d'|' < test | sed -e 's/^"\(.*\)"/\1/g' | tr '"' 'W'

sbW sri
rssW WNIL

最后替换回外部引号

cut -f4 -d'|' < test | sed -e 's/^"\(.*\)"/\1/g' | tr '"' 'W' \
    | sed -e 's/\(.*\)/"\1"/g'

"sbW sri"
"rssW WNIL"

答案2

您似乎想要将管道分隔文件的第四个字段中的“内部双引号”替换为W.这可以使用以下方法完成awk

awk 'BEGIN{FS=OFS="|"} {gsub(/^\"|\"$/,"",$4);gsub(/\"/,"W",$4);$4="\"" $4 "\""}1' hello.txt

此命令将首先从第四个字段中删除左双引号和右双引号,然后将剩余的双引号替换为W,并在文本周围重新添加一个左双引号和一个右双引号。

结果:

123|"xy"|11|"sbW sri"|13|"bb" 
123|"xy"|11|"rssW WNIL"|13|"bb"

相关内容