我试图在另一个字符串之前找到前面的字符串。例如:
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
这似乎是有效的,但有点麻烦。有没有更好的方法来达到预期的效果呢?
答案 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
行时打印出模式空间中的第一个字符串。