Bash:在文件中的另一个字符串之前找到一个字符串

时间:2013-04-25 00:33:18

标签: bash sed grep

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

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

答案 0 :(得分:3)

grep "\(StringA\|StringB\)" $file_name | grep -B 1 StringB | grep StringA

答案 1 :(得分: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
   }'

答案 2 :(得分:1)

使用awk:

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

String和String可以是正则表达式。

答案 3 :(得分:0)

这可能适合你(GNU sed):

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

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