Как удалить совпадающую строку и предыдущую? - PullRequest
6 голосов
/ 11 сентября 2011

Мне нужно удалить соответствующую строку и одну предыдущую.Например, в приведенном ниже файле мне нужно удалить строки 1 и 2.

Я попробовал страницу "grep -v -B 1". of."1.txt и ожидал, что она не будет напечатанастроки соответствия и контекст.

Я попробовал Как удалить совпадающую строку, строку выше и строку ниже, используя sed? , но не смог понять использование sed.

---1.txt--
**document 1**                         -> 1
**page 1 of 2**                        -> 2

testoing
testing

super crap blah

**document 1**
**page 2 of 2**

Ответы [ 4 ]

12 голосов
/ 11 сентября 2011

Вы хотите сделать что-то очень похожее на ответ , данный

sed -n '
/page . of ./ { #when pattern matches
n #read the next line into the pattern space
x #exchange the pattern and hold space
d #skip the current contents of the pattern space (previous line)
}

x  #for each line, exchange the pattern and hold space
1d #skip the first line
p  #and print the contents of pattern space (previous line)

$ { #on the last line
x #exchange pattern and hold, pattern now contains last line read
p #and print that
}'

А в виде одной строки

sed -n '/page . of ./{n;x;d;};x;1d;p;${x;p;}' 1.txt
2 голосов
/ 11 сентября 2011

grep -v -B1 не работает, потому что пропустит эти строки, но включит их позже (из-за -B1. Чтобы проверить это, попробуйте команду на:

**document 1**                         -> 1
**page 1 of 2**                        -> 2

**document 1**
**page 2 of 2**
**page 3 of 2**

Вы заметите, что строка page 2 будет пропущена, потому что эта строка не будет совпадать, а следующая не будет совпадать.

Есть простое решение awk:

awk '!/page.*of.*/ { if (m) print buf; buf=$0; m=1} /page.*of.*/ {m=0}' 1.txt

Команда awk сообщает следующее:

Если текущая строка имеет эту "страницу ... из", то это будет сигнализировать, что вы не нашли правильную строку. Если вы не нашли эту строку, то вы печатаете предыдущую строку (сохраненную в buf) и сбрасываете буфер в текущую строку (следовательно, вынуждая его отставать на 1)

1 голос
/ 11 сентября 2011
grep -vf <(grep -B1 "page.*of" file | sed '/^--$/d') file
0 голосов
/ 11 сентября 2011

Не слишком знаком с sed, но вот выражение perl, чтобы сделать трюк:

cat FILE | perl -e '@a = <STDIN>;
                    for( $i=0 ; $i <= $#a ; $i++ ) { 
                     if($i > 0 && $a[$i] =~ /xxxx/) { 
                       $a[$i] = ""; 
                       $a[$i-1] = "";
                     }
                    } print @a;'

редактирование:

где "xxxx" - это то, что вы пытаетесь сопоставить.

...