исключить определенные строки из замены в sed

Вы можете использовать sudo journalctl _PID=<pid>, если знаете PID. Это может быть полезно в тех случаях, когда процесс был слишком коротким -для того, чтобы systemd могла разрешить имя модуля.

1
11.12.2019, 11:54
4 ответа

Вы можете попробовать что-то подобное с awk

awk '{ if (NR !~ /^(1|[4-7]|38|39)$/) { gsub(/[,:\{\}\[\]]+/,"",$0) }; print }' your-file.txt

если номер строки NR (не совпадает с 1 или 4 до 7 или 38 или 39, то замените знаки на «ничего». Затем выведите строку

0
27.01.2020, 23:17

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

sed -e '1!{ 4,7!{ 38,39! s/[][,:{}]//g ;}' -e '}' file_in > file_out

Пример (с разными диапазонами для сокращения):

$ printf 'line %s, : { } [ ]\n' {1..10} | sed -e '1!{ 4,6!{ 8,9! s/[][,:{}]//g ;}' -e '}'
line 1, : { } [ ]
line 2
line 3
line 4, : { } [ ]
line 5, : { } [ ]
line 6, : { } [ ]
line 7
line 8, : { } [ ]
line 9, : { } [ ]
line 10
3
27.01.2020, 23:17

Один из подходов заключается в использовании команды bдля строк, которые вы хотите сохранить в первую очередь.:

sed -e 1b -e 4,7b -e 38,39b -e 's/[][,:{}]//g'

Или:

sed '
  1     b
  4,7   b
  38,39 b
  s/[][,:{}]//g'

С реализацией GNU sedвы также можете написать это:

sed '1b;4,7b;38,39b;s/[][,:{}]//g'
1
27.01.2020, 23:17

Используя Perl, мы можем использовать диапазоны строк для отмены выбора с помощью очень низкого приоритета или оператора.

$ perl -pe '1..1 or 4..7 or 38..39 or tr/][,:}{//d'

Другой способ:

perl -pe 'grep { $. == $_ } (1, 4..7, 38..39) or tr/[]{},://d' 
1
27.01.2020, 23:17

Теги

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