我有一个包含一堆行的文件。
我想从文件中删除以 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