在文件中查找字符的位置并存储其位置bash

时间:2016-12-07 13:32:36

标签: bash shell scripting position character

我需要使用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脚本完成?

2 个答案:

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

的评论