Инвертировать совпадение в sed для печати всех строк до разрыва строки

Для этой версии Linux нужны только файлы /proc и ps. Он адаптирован из последней части отличного ответа @maxschlepzig . Эта версия считывает /proc непосредственно из оболочки, а не порождает подпроцесс -в цикле. Это немного быстрее и, возможно, немного элегантнее, как того требует заголовок этой темы.

#!/bin/dash

# Print all descendant pids of process pid $1
# adapted from https://unix.stackexchange.com/a/339071

ps=${1:-1}
while [ "$ps" ]; do
  echo $ps
  unset ps1 ps2
  for p in $ps; do
    read ps2 < /proc/$p/task/$p/children 2>/dev/null
    ps1="$ps1 $ps2"
  done
  ps=$ps1
done | tr " " "\n" | tail -n +2

0
15.12.2020, 15:32
1 ответ

Это было бы проще сделать с awk, чем сsed:

$ awk -v RS='' -F '\n' '!($1 ~ /ZZZ$/)' file
sometext tobe here xxx_yyyy: AAA
sjhdajsh
skdjah
hjk

Это сначала устанавливает разделитель записей RSна пустую строку. При этом специальном значении RSawkкаждый абзац, разделенный одной или несколькими пустыми строками, будет рассматриваться как запись. С помощью -F '\n'мы говорим awkрассматривать каждую строку абзаца как поле.

Тест !($1 ~ /ZZZ$/)будет верен для каждой записи (абзаца ), чье первое поле (1-й строки )не не заканчивается строкой ZZZ. Каждый такой абзац будет напечатан.

Если вы хотите, чтобы после каждого выводимого раздела была пустая строка, добавьте -v ORS='\n\n'в командную строку awk(перед кодом awk).


С помощью sedвы могли бы сделать

$ sed '/ZZZ$/,/^$/d' file
sometext tobe here xxx_yyyy: AAA
sjhdajsh
skdjah
hjk

То есть «удалить все строки между любой строкой, оканчивающейся на ZZZ, до следующей пустой строки». Вы также можете использовать выражение sed/ZZZ$/,/^$/!pс sed -n. Обратите внимание, однако, что ZZZв любой другой строке, отличной от первой строки абзаца, также вызовет это удаление.

Очевидно, что эту проблему можно было бы решить (, прочитав абзацы построчно в отведенное место, а затем решив, какие из них напечатать, а какие отбросить ), но это превратилось бы в большую проблему. чем просто использование варианта awkвыше.


Просто чтобы прокомментировать выражение [^ZZZ], которое вы используете в вопросе. Это точно эквивалентно [^Z]и будет соответствовать любому одиночному символу, который не является Z. Точно так же [^text]совпадает с [^etx]и будет соответствовать любому одиночному символу, который не является e, tили x.

1
18.03.2021, 22:42

Теги

Похожие вопросы