sed 有两个条件

sed 有两个条件

我有一个包含一堆行的文件。
我想从文件中删除以 25 个字符开头nnn 且长度超过 25 个字符的条目。

目前我只能制作两个单独的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 }替换为 just 。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

相关内容