sedから特定の行を置き換えから除外

sedから特定の行を置き換えから除外

特定の行を除くいくつかの句読点を削除したいと思います。たとえば、sedこれらの, : { } [ ]マーカーだけを削除し、1、4〜7、38、39行は削除したくありません。どうやってこれを達成できますか?

答え1

ブロックの後にブロックを追加して、置き換えから除外できます。

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

答え2

b1つの方法は、最初に保持したい行でコマンドを使用することです。

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'

答え3

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' 

答え4

awkでこのようなことを試すことができます

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

NR(行番号が1、4〜7、38、または39と一致しない場合は、記号を「なし」に置き換えます。次に行を印刷します。

関連情報