我有一个 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"