2016-12-07 97 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用於將包含多個匹配線)部分的長度。