在vim / sed中用单个空白行替换多个空白行


42

问题或多或少说明了一切。我知道这/^$/d将删除所有空白行,但看不到如何说“用单个空白行替换两个或更多空白行”

有任何想法吗?

Answers:


48

如果您不触发vim或将sed用于其他用途,cat实际上有一种简单的内置方法来折叠多个空白行,只需使用即可cat -s

如果您已经在vim中并且想要留在那儿,则可以通过内部搜索来执行此操作,并通过发出以下命令替换::%s!\n\n\n\+!^M^M!g(^ M是换行符的可视表示形式,您可以通过按Ctrl+ 来输入vEnter),或者保存自己只需炮击给cat:即可输入内容:%!cat -s


哇,不知道-scat 的选项-只是一个历史性注释,它不在POSIX中,但似乎在BSD和GNU cat中可用。
maxschlepzig 2011年

2
被标记为“获胜” :%!cat -s。每天学习GNnew!
Andrew Bolster,

3
我认为您也可以像这样使用\ r代替^ M:%s!\n\n\n\+!\r\r!g
Niko Bellic

我今天需要这个。谢谢,迦勒!:)
Dɑvïd

19

用于\n在搜索模式中指示换行符。在替换文本中使用Ctrl+ M或向后引用。参见:help pattern:help sub-replace-special(链接自:help :s)。

%s/\(\n\n\)\n\+/\1/

您能解释一下搜索方式吗?
萨加尔·in那

@sjmp要求:用单个空白行替换两个或更多空白行。实现:用两个换行符替换三个或更多连续的换行符。有关命令中使用的构造的说明,请参见手册。
吉尔斯(Gillles)“所以-别再邪恶了”

但是,为什么固定了组的内容后就需要使用组?
Sabuncu

@Sabuncu您不需要使用群组。但是为什么不使用小组呢?在这里,我使用了一个组,因为您不能在替换文本中复制粘贴带有换行符的命令:您需要插入文字Ctrl + M字符,\n在替换文本中不起作用。
吉尔斯(Gillles)“所以-别再邪恶了”

现在我明白了,谢谢您抽出宝贵的时间回答。
Sabuncu


0

使用Perl:

perl -00 -pe ''

-00 命令行选项打开段落Slurp模式,这意味着Perl逐段而不是逐行读取文本。


0

使用sed(GNU sed)4.2.2:

sed -r '
  /^\s*$/ { 
    # blank line
:NEXT
    N # append next line to pattern space - if none, autoprint PS and exit
    s/^\s*$\n^\s*$//g;t NEXT # if 2 blank lines, clear PS and loop to NEXT
  }
  # else, autoprint PS and next/exit
' < $MYFILE

-2

我知道这是愚蠢的代码,但我想在不到10分钟的时间内解决此问题,并且它有效

for file in /directory/*
do
  originalname=$file
  us='_'
  tempname=$file$us
  echo $originalname
  mv $originalname $tempname
  uniq $tempname $originalname
  rm $tempname
done

1
uniq删除相邻的等号线。OP并不想这样。
pacholik

@pacholik他清楚地说:“用单个空白行替换多个空白行”不会删除相邻的相等行!
Mahmoud Zalt

3
是的,确切的是……
pacholik
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.