2016-12-07 79 views
-1

我需要使用Bash脚本在文件中查找特定字符##的所有位置,并存储所有位置以供将来使用。在文件中查找某个字符的位置并存储其位置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脚本完成?

+3

“位置”是什么意思?也许从行前面的零指标位置? –

+2

如果出现三个'#'会怎么样? – 123

+1

或者“locatoin”= 1是从文件顶部到底部的?而且,我们正在帮助人们**修复**代码,**您尝试过什么?**(更新您的Q,请勿在评论中回复)。祝你好运。 – shellter

回答

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的第一个外观。不知道你是否需要获得更多的外观。丹尼斯Williamsons提取

解决方案发表评论,this post

+0

Theres 4发生...... – 123

+0

谢谢,但我需要知道文件中所有出现在这个角色的位置。 – mii9

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用于将包含多个匹配线)部分的长度。