我有这个示例文件
{
{
doSomething();
}
}
我想要实现的目标是:
{
{
doSomething();
}
}
我试过这个
sed -r -i -e's /} \ n +} /} \ n} / g'file.txt
但无济于事。
我想删除右括号之间的换行符。
注意:我已经阅读了这个How can I replace a newline (\n) using sed?并且我也知道N命令,但是我无法创建一个有效的sed表达式来实现我想要实现的目标。
答案 0 :(得分:1)
使用sed:
$ sed 'H;1h;$!d;x; s/}\n\n*}/}\n}/g' file
{
{
doSomething();
}
}
如果要更改文件,请使用-i
开关:
sed -i 'H;1h;$!d;x; s/}\n\n*}/}\n}/g' file # GNU sed
sed -i '' -e 'H;1h;$!d;x; s/}\n\n*}/}\n}/g' file # BSD sed
H;1h;$!d;x;
这是一个sed成语,它将整个文件读入模式空间。 (如果您的文件很大,我们希望查看其他解决方案。)
s/}\n\n*}/}\n}/g
这只是您的替换命令,只有一处更改:\n+
更改为\n\n*
。这是因为+
不是基本正则表达式下的活动字符。如果我们使用扩展正则表达式,则大括号{
和}
将成为活动字符,这可能导致此输入的其他问题。
请注意,仅当第二个右括号}
出现在一行的开头时,才会删除额外的换行符。
答案 1 :(得分:1)
使用awk:
awk -v RS='}' -v 'ORS=}' '!/{/{gsub(/\n+/,"\n")};1' file-name | head -n -1
答案 2 :(得分:0)
你打算做什么并不明显。但是,如果你想使用多行正则表达式,你应该知道,在它的经典形式中,sed不是一次只能在多行上运行(可能有一些多线版本的sed已经出现)。您可以使用其他工具,如perl。我需要时通常会执行以下工作流程:
tr '\n' 'µ' < myfile.txt | sed -e 's/µ}µ/}/' | tr 'µ' '\n'
(因为μ字符在我的键盘上可用,并且最不可能出现在我正在使用的文件中)。初始tr
命令从我的文件中生成一个大行,第二个tr
命令将换行符再次放在其初始位置。