1

我试图在另一个字符串之前找到前面的字符串。例如:

StringA <stuff 1>
StringA <stuff 2>
StringD
...
StringB <stuff 3>
StringA <stuff 4>
StringA <stuff 5>
StringA <stuff 6>
StringD
StringB <stuff 7>

我想在文件中找到所有在 StringB 之前的“StringA”。

此示例中的输出将是:

StringA <stuff 2>
StringA <stuff 6>

我可以使用以下方法找到所有 StringB 的行号: grep -n "StringB"

然后我可以使用 sed -n 1,$line_numberp 这使我从第 1 行转到 StringB 行。我做 grep "StringA" | 尾-n1

这似乎可行,但有点麻烦。请问有没有更好的方法来达到预期的结果?

4

4 回答 4

3
grep "\(StringA\|StringB\)" $file_name | grep -B 1 StringB | grep StringA
于 2013-04-25T00:45:46.443 回答
1
sed '/String[AB]/!d' input | 
   sed -n -e '/StringA/{:l /StringA/h;n;/StringB/{x;p;b};bl}'

附评论:

sed '/String[AB]/!d' input |      # remove lines not containing StringA/B
   sed -n -e '/StringA/{          # if line contains StringA, then
      :l                          # loop until StringB
          /StringA/h;             # keep the most recent A in the hold space
          n;                      # read a newline (overwrite pattern space)
          /StringB/!bl;           # loop up...
          x;p;b                   # get the most recent A, and print
   }'
于 2013-04-25T00:45:25.403 回答
1

使用 awk :

awk '/^StringB/ { if(lastline ~ /^StringA/) {print lastline }} {lastline=$0}' $file

StringA 和 StringB 可以是正则表达式。

于 2013-04-25T01:14:44.907 回答
0

这可能对您有用(GNU sed):

sed ':a;$!N;/^StringA/!D;/^\(StringA\).*\n\1/D;/.*StringB/!ba;P;D' file

这将删除保留最后一行的重复StringA行,并在遇到StringB一行时打印出模式空间中的第一个字符串。

于 2013-04-25T06:01:23.183 回答