我写了一个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);*** **
答案 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