我有一个包含以下内容的文件:
something
something else
something else again
我需要一个bash命令,sed / grep w.e,它将产生以下输出
something
something else
something else again
换句话说,我需要用一个空白行替换多个空白行。 grep / sed是基于行的。我从来没有找到适用于多行正则表达式模式的BASH解决方案。
答案 0 :(得分:74)
对于BSD派生系统(包括GNU):
您只需要cat
-s
选项,这会导致它从输出中删除重复的空行:
cat -s
从手册页:-s --squeeze-blank: suppress repeated empty output lines.
答案 1 :(得分:15)
我刚刚通过sed
解决了这个问题。即使这是一个7岁的问题,有人可以在这里寻求帮助,所以我在sed
处写我的解决方案:
sed 'N;/^\n$/D;P;D;'
答案 2 :(得分:13)
grep -A1 . <yourfile> | grep -v "^--$"
这个grep解决方案可以正常运行,假设您需要以下内容:
<强>输入强>
line1
line2
line3
line4
line5
<强>输出强>
line1
line2
line3
line4
line5
答案 3 :(得分:11)
实际上,如果用一个换行符替换多个换行符,则输出结果为:
something
something else
something else again
您可以通过以下方式实现这一目标:
sed /^$/d FILE
答案 4 :(得分:3)
使用awk
的解决方案,用一个空白行替换几个空白行:
awk 'BEGIN{bl=0}/^$/{bl++;if(bl==1)print;else next}/^..*$/{bl=0;print}' myfile
答案 5 :(得分:3)
通常,如果我发现sed无法做我需要的事情,我会转向awk:
awk '
BEGIN {
blank = 0;
}
/^[[:blank:]]*$/ {
if (!blank) {
print;
}
blank = 1;
next;
}
{
print;
blank = 0;
}' file
答案 6 :(得分:3)
这在多个文件上使用marco's solution:
for i in *; do FILE=$(cat -s "$i"); echo "$FILE" > "$i"; done
答案 7 :(得分:2)
如果有人想使用perl
perl -00pe0 < file
将执行相同的操作,如cat -s
:)
答案 8 :(得分:1)
使用python:
s = file("filename.txt").read()
while "\n\n\n" in s: s = s.replace("\n\n\n", "\n\n")
import sys
sys.stdout.write(s)
答案 9 :(得分:1)
Python,带正则表达式:
import re
import sys
sys.stdout.write(re.sub('\n{2,}','\n\n', sys.stdin.read()))
答案 10 :(得分:0)
使用awk:
awk '{ /^\s*$/?b++:b=0; if (b<=1) print }' file
故障:
/^\s*$/?b++:b=0
- ? : the ternary operator
- /^\s*$/ matches a blank line
- b variable that counts consecutive blank lines (b++).
however, if the current line is non-blank, b is reset to 0.
if (b<=1) print
print if the current line is non-blank (b==0)
or if there is only one blank line (b==1).
通过调整正则表达式,您可以将其推广到其他情况,例如在电子邮件中挤压多个空白行(“>”): https://stackoverflow.com/a/59189823/12483961
答案 11 :(得分:-1)
使用vim非常容易。只需打开文件并输入以下内容:
:%s/\n\n\n*/\r\r/
这会将超过2个新行的所有块减少到2个新行。希望这有帮助!
答案 12 :(得分:-2)
我认为你可能想要删除只有空格的行。
可以通过以下方式完成:
sed /^[:space:]*$/d FILE
答案 13 :(得分:-4)
将其移植到| uniq 可能是解决方案(如果空行不重复)