如何使用Shell脚本grep搜索词(....)旁边的单词?

时间:2013-12-06 08:09:41

标签: shell awk

我写了一个shell脚本来识别给定的单词并grep给定单词旁边的单词。请参阅下面的示例输入文件。另外,我需要在示例输出文件中编写如下所示的相同文件。

#!/bin/bash 

LOGFILE=$1 

if [ -f $LOGFILE ]
then 
        sed -i.bak 's/sqrt(\(\w*\))/sqrt(\1) print(\1)/g' $LOGFILE
else 
        echo "$LOGFILE not found " 
fi

但是当我运行这个shell脚本时,我的文件中没有任何反应。请你帮助我好吗?

示例输入文件:

wewe **sqrt(a+B)**  eeenwerer ergv. **sqrt(2x-3)** gtgnwerer ergv. **sqrt(wea*B)** gjjj nwerer ergv. **sqrt(a2/B)** rrnwerer ergv.

预期的文件输出:

wewe **sqrt(a+B)** eeenwerer ergv. ***write (a+B);*** **sqrt(2x-3)** gtgnwerer ergv. ***write (2x-3);*** ** **sqrt(wea*B)** gjjj nwerer ergv. ***write (wea*B);*** ** **sqrt(a2/B)** rrnwerer ergv.***write (a2/B);*** **

4 个答案:

答案 0 :(得分:1)

您可以尝试:

awk -f mod.awk input.txt

其中input.txt是您输入的日志文件,mod.awk是:

{
    str=str $0 ORS
}
END {
    str2=""
    prev=""
    while(match(str,/sqrt\(([^)]*)\)/,a)) {
        cur=substr(str,RSTART,RLENGTH)
        end=substr(str,RSTART+RLENGTH)
        str2=str2 substr(str,1,RSTART-1) prev cur
        str=end
        prev="*write(" a[1] ");"
    }
    print str2 str prev
}

给定输入文件input.txt

wewe sqrt(a+B)  eeenwerer ergv. sqrt(2x-3) gtgnwerer ergv. sqrt(wea*B) gjjj nwerer ergv. sqrt(a2/B) rrnwerer ergv.

运行awk -f mod.awk input.txt会产生输出:

wewe sqrt(a+B)  eeenwerer ergv. *write(a+B);sqrt(2x-3) gtgnwerer ergv. *write(2x-3);sqrt(wea*B) gjjj nwerer ergv. *write(wea*B);sqrt(a2/B) rrnwerer ergv.*write(a2/B);

答案 1 :(得分:0)

如果单词在一个单独的行中你不能尝试这个,它将搜索单词并打印它旁边的行。

awk' /要搜索的字词:/ {getline; print;}'

答案 2 :(得分:0)

由于你想在'sqrt(' - '之后'找到除'''之外的所有字符,你可以使用'[^]] *'来匹配这个字符集。 然后你可以显式地搜索模式sqrt(...)和sqrt(...(...)....)作为两个单独的案例。

sed '
    s/sqrt(\([^)]*)\)/sqrt(\1) print(\1)/g
    s/sqrt(\([^)]*([^)]*)[^)]*)\)/sqrt(\1) print(\1)/g
'

如果将'[^)] *'更改为Z

,这将更容易理解
sed '
    s/sqrt(\(Z)\)/sqrt(\1) print(\1)/g
    s/sqrt(\(Z(Z)Z)\)/sqrt(\1) print(\1)/g
'

答案 3 :(得分:0)

这有点类似于HåkonHægland的解决方案,但更短,也适用于awk的旧版本,其中match()不能有3个参数:

awk -F'sqrt\\(' '
    { for (i=1; ++i<=NF; )
        $i = gensub("(.*)\\)(.*)", "sqrt(\\1)\\2 write(\\1);", 1, $i)
      print
    }           ' $LOGFILE