複数行を含むファイルがあります。 25文字で始まり、25文字を超える
ファイルから項目を削除したいと思います。nnn
現在は2つだけ作成できますsed
。
sed '/^nnn/d' input.txt > output.txt
sed '/^.\{25\}./d' input.txt > output.txt
しかし、それは私の目標ではありません。
入力例:
nnnASDDGfdgdsfndsjfndsjfdfgGHGHGhfhfd
nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG
希望の出力:
nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG
答え1
これは次の方法で行うのが最善ですawk
。
awk '/^nnn/ && length >= 25 { next } { print }' file
/^nnn/
与えられた正規表現(「次から始まる行」)と一致しますnnn
。 length
(またはlength($0)
)は入力ラインの長さを返します。式が一致し、長さが25以上の場合、その行は無視され、それ以外の場合は印刷されます。入力が長すぎると感じたら{ print }
。1
または、
awk '!/^nnn/ || length < 25' file
これは同じことを行いますが、反対の条件を使用します。行が式と一致しない場合、または25文字未満の場合は印刷されます。他の行は無視されます。
これら両方の製品
nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG
与えられた入力データについて。
答え2
sed
解決策:
sed -E '/^nnn.{23}/d' file
/^nnn.{23,}/
nnn
- 25文字以上で始まる行のみが一致します。 (.{23,}
- 長さが23文字以上の文字シーケンスと一致します。)d
- 一致する行を削除
出力:
nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG
そしてawk
注文する:
awk '!/^nnn.{23}/' file
答え3
次のことができます。
sed -e '/^nnn/!b' -e '/.\{26\}/d'
または:
sed '/^nnn/{/.\{26\}/d;}'
答え4
grepを使う
grep -v '^nnn.\{23\}' infile