我有一个文件,其中包含以下格式的文字:
这是随机文本(“为什么”“因为”“谁”;“为什么”“谁”)再一些随机文本
所以要选择的所有单词都在parentethis之间,每个单词都在引号内。
所以我需要一些bash代码来删除已经在第二部分(分号后)的任何单词的第一次出现。 在上面的例子中,命令的结果是:
这是随机文本(“因为”;“为什么”“谁”)再一些随机文本
感谢
答案 0 :(得分:1)
以下是如何做到的:
awk -F"[()]" '{split($2,a,";");n=split(a[2],b," ");for (i=1;i<=n;i++) gsub(b[i],x,a[1]);print $1 "(" a[1] ";" a[2] ")" $3}' file
this is random text ( "because" ; "why" "who") again some random text
或者像这样写的
awk -F"[()]" '
{split($2,a,";")
n=split(a[2],b," ")
for (i=1;i<=n;i++)
gsub(b[i],x,a[1])
print $1 "(" a[1] ";" a[2] ")" $3}
' file
答案 1 :(得分:1)
在Gnu Awk第4版中你可以使用
gawk -f a.awk file
其中a.awk
是
{
n=patsplit($0,L,"\\(.*\\)",S)
split(L[1],a,";")
n1=patsplit(a[1],b,"\"[^\"]*\"",s1)
n2=patsplit(a[2],c,"\"[^\"]*\"",s2)
for (i=1; i<=n1; i++)
for (j=1; j<=n2; j++)
if (b[i]==c[j])
b[i]=""
printf "%s%s",S[0],s1[0]
for (i=1;i<=n1; i++)
printf "%s%s",b[i],s1[i]
printf ";%s%s\n",a[2],S[1]
}
带输出
this is random text ( "because" ; "why" "who") again some random text
答案 2 :(得分:1)
我会用awk开始这样的事情,未经测试:
match($0,/[(][^)]+/) {
head = substr($0,1,RSTART)
body = substr($0,RSTART+1,RLENGTH-1)
tail = substr($0,RSTART+RLENGTH)
split(body,parts,/;/)
....
do stuff with parts to rebuild body
....
print head body tail
}