我需要使用Bash脚本在文件中找到特定字符##
的所有位置,并存储所有位置以供将来使用。
这是文件的样子:
assert property ( ( req1 == 0 ) ##1 ( req1 == 1 ) ##1 !( req2 == 1 ) || (gnt1 == 0 ) );
assert property ( ( req1 == 0 ) ##1 !( req1 == 1 ) || ( gnt1 == 1 ) );
assert property ( ( req1 == 1 && req2 == 0 ) ##1 !( req2 == 1 ) || ( gnt1 == 0 ) );
在上面的文件中,我想获取此角色的所有位置(##
)并存储它们。如何使用shell脚本完成?
答案 0 :(得分:1)
您可以使用awk:
awk -F'##' '
{
for(i=1;i<NF;i++){
printf "%d ",length($i)+offset+1
offset+=length($i)+length(FS)
}
printf "\n"
offset=0
}' file
参数分隔符-F
被设置为您的模式。
循环遍历该行的所有部分($1
,$2
...)并打印实际指示模式位置的每个部分的长度(添加offset
为包含多个匹配的行。)
答案 1 :(得分:0)
试试这个
#!/bin/bash
str1="assert property ( ( req1 == 0 ) ##1 ( req1 == 1 ) ##1 !( req2 == 1 ) || (gnt1 == 0 ) );"
str2="assert property ( ( req1 == 0 ) ##1 !( req1 == 1 ) || ( gnt1 == 1 ) );"
str3="assert property ( ( req1 == 1 && req2 == 0 ) ##1 !( req2 == 1 ) || ( gnt1 == 0 ) );"
char="##"
awk -v a="$str1" -v b="$char" 'BEGIN{print index(a,b)}' | xargs expr -1 +
awk -v a="$str2" -v b="$char" 'BEGIN{print index(a,b)}' | xargs expr -1 +
awk -v a="$str3" -v b="$char" 'BEGIN{print index(a,b)}' | xargs expr -1 +
这些例子的位置是32,32和45。但每个人只有第一次出现## char。不确定你是否需要更多的外表。
解决方案摘自Dennis Williamsons对this post
的评论