如果长度超过XY,如何删除行?


21

如果行的长度超过例如2048个字符,该如何删除?


您坚持使用sed吗?这很容易,例如在python中。毫无疑问,在Perl中甚至更容易。尽管这个问题还没有得到很好的定义。复制文件,删除所有超过2048行的行,还是其他?
Faheem Mitha

Answers:


22
sed '/^.\{2048\}./d' input.txt > output.txt

3
我收到错误消息sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)(Mac OS X)
wedi 2014年

1
@wedi您可能想要安装GNU版本而不是Mac随附的BSD版本。酿造啤酒很容易
Freedom_Ben '16

问题是“如果长于XY(例如2048个字符)”。然后它必须是> 2048而不是=> 2048
ajcg

1
@ajcg,它大于2048。请注意,正则表达式的末尾还有一个额外的句点来匹配第2049个字符。
forcefsck

@forcefsck,把它拿走“ ^”会更好吗?(使用命令仅删除“以XYZ开头”的行,但是如果XYZ在该行的另一部分,则不会删除它)
ajcg

7

这是删除具有2049个或更多字符的行的解决方案:

sed -E '/.{2049}/d' <file.in >file.out

该表达式/.{2049}/d将匹配至少包含2049个字符的任何行,并将其从输入中删除,仅在输出中产生较短的行。

使用awk,打印长度为2048或更短的行:

awk 'length <= 2048' <file.in >file.out

sed从字面上模拟解决方案awk

awk 'length >= 2049 { next } { print }' <file.in >file.out

1
我收到错误消息sed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s)(Mac OS X)
wedi 2014年

1
@wedi现在已在macOS Mojave上进行了更新和测试。
库沙兰南达

2

像这样的东西应该在Python中工作。

of = open("orig")
nf = open("new",'w')
for line in of:         
    if len(line) < 2048:
        nf.write(line)
of.close()
nf.close()

1
就个人而言,@ Faheem,我希望您的回答。原因是我很容易将其变成“删除所有小于x的行”。我并不是一直都在使用Python,但是当我这样做时,我总是觉得我应该学得很好。
ixtmixilix

@ixtmixilix:是的,使用像Python这样的功能齐全的语言非常灵活。感谢您的评论。
Faheem Mitha

2
perl -lne "length < 2048 && print" infile > outfile

+1 -l但这不是必需的。
Joseph R.

对我不起作用。Perl v5.16.2。Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1.
wedi 2014年

你可以试试看length($_) > 2048 && print。无论如何length都是快捷方式length($_)
MaratC 2014年

0

在Mac OS X 10.9.5上,以上答案对我不起作用。

以下代码可以正常工作:

sed '/.\{2048\}/d'

虽然没有要求,但仅供参考,可以通过以下代码实现反向:

sed '/.\{2048\}/!d'


大声笑,但sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)Mac OS X, 10.10.4
亚历克斯·格雷

啊。我安装了GNU版本,而不是Mac附带的BSD版本,如上面建议的@Freedom_Ben。但是Kusalananda找到了启用扩展正则表达式的开关。因此,如果您仍然有此问题,则应选择他的解决方案。;)
wedi

0

使用gnu-sed时,可以使用-r标志以避免输入反斜杠,而使用逗号来定义打开间隔:

sed -r  "/.{2049,}/d" input.txt > output.txt

与:

  • x {2049}表示2049 xs
  • x {2049,3072}的含义是2049至3072 xs
  • x {2049,}表示至少2049 xs
  • x {,2049}表示最多2049 xs

对于间隔,为了不匹配更大的模式,您需要像

sed -r  "/^.{32,64}$/d" input.txt > output.txt 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.