У меня есть файл в следующем формате:

--- V1 ---
Hi there
--- V2 ---
--- V3 ---
What's good
--- V4 ---
--- V5 ---
--- V6 ---

Я хочу использовать какой-то сценарий bash для удаления любой из строк, начинающихся с трех штрихов, за которыми сразу же не следует строка, в которой НЕ содержится трех штрихов, например:

--- V1 ---
Hi there
--- V3 ---
What's good

Я могу легко удалить ВСЕ строки, начинающиеся с тире, но не знаю, как это сделать, основываясь на следующей строке (или, альтернативно, на основе строки, предшествующей не пунктирным линиям).

2 ответа2

2

Я предполагаю, что «какой-то» означает, что вы не настаиваете на чистом ударе. Если так, то awk может сделать это хорошо:

/tmp$ input="--- V1 ---
Hi there
--- V2 ---
--- V3 ---
What's good
--- V4 ---
--- V5 ---
--- V6 ---"
/tmp$ echo "$input" | awk '/^---/ {row = $0; if (wasdashed) next; wasdashed=1; next}; { if (wasdashed) print row; print $0}'
--- V1 ---
Hi there
--- V3 ---
What's good
/tmp$

В любом случае, с той же логикой, возможен чистый bash, но с гораздо большим количеством кода.

0
grep -v -B1 "^---" file.name 

Будет искать все строки, которые не начинаются с "---", и отображать эти строки. «-B1» отображает строку непосредственно перед.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .