如果bash中存在两个,则删除第一个出现

时间:2013-12-31 14:14:00

标签: regex bash shell sed awk

我有一个文件,其中包含以下格式的文字:

  

这是随机文本(“为什么”“因为”“谁”;“为什么”“谁”)再一些随机文本

所以要选择的所有单词都在parentethis之间,每个单词都在引号内。

所以我需要一些bash代码来删除已经在第二部分(分号后)的任何单词的第一次出现。 在上面的例子中,命令的结果是:

  

这是随机文本(“因为”;“为什么”“谁”)再一些随机文本

感谢

3 个答案:

答案 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
}