sed 有两个条件

use*_*411 6 sed text-processing

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

现在我只能做两个分离sed

sed '/^nnn/d' input.txt > output.txt
sed '/^.\{25\}./d' input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)

但这不是我的目标。

示例输入:

nnnASDDGfdgdsfndsjfndsjfdfgGHGHGhfhfd
nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG
Run Code Online (Sandbox Code Playgroud)

期望的输出:

nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 8

最好通过awk以下方式完成:

awk '/^nnn/ && length >= 25 { next } { print }' file
Run Code Online (Sandbox Code Playgroud)

/^nnn/会匹配给定的正则表达式(“行开头nnn”)。 length(或length($0)) 将返回输入行的长度。如果表达式匹配且长度为 25 或更长,则忽略该行,否则将打印。如果感觉打字太长,{ print }可能会被替换1

或者,

awk '!/^nnn/ || length < 25' file
Run Code Online (Sandbox Code Playgroud)

这做同样的事情,但条件相反。如果该行与表达式不匹配,或者少于 25 个字符,则将其打印出来。其他行被忽略。

这两种产

nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG
Run Code Online (Sandbox Code Playgroud)

对于给定的输入数据。


Rom*_*est 6

sed 解决方案:

sed -E '/^nnn.{23}/d' file
Run Code Online (Sandbox Code Playgroud)
  • /^nnn.{23,}/- 仅匹配以nnn25 个字符开头且超过 25 个字符的行(.{23,}- 匹配至少 23 个字符长的字符序列)
  • d - 删除匹配的行

输出:

nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG
Run Code Online (Sandbox Code Playgroud)

awk命令相同:

awk '!/^nnn.{23}/' file
Run Code Online (Sandbox Code Playgroud)

  • 你不需要两个条件:`sed -E '/^nnn.{23}/d' infile` 就可以了。 (3认同)

Sté*_*las 6

你可以这样做:

sed -e '/^nnn/!b' -e '/.\{26\}/d'
Run Code Online (Sandbox Code Playgroud)

或者:

sed '/^nnn/{/.\{26\}/d;}'
Run Code Online (Sandbox Code Playgroud)