sedには2つの条件があります

sedには2つの条件があります

複数行を含むファイルがあります。 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/与えられた正規表現(「次から始まる行」)と一致しますnnnlength(または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

関連情報