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)
最好通过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)
对于给定的输入数据。
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/!b' -e '/.\{26\}/d'
Run Code Online (Sandbox Code Playgroud)
或者:
sed '/^nnn/{/.\{26\}/d;}'
Run Code Online (Sandbox Code Playgroud)