如何使用 sed 替换字符之间的多个换行符 (\n)?
How can I replace multiple newlines(\n) between characters using sed?
我有这个示例文件
{
{
doSomething();
}
}
我想要实现的是:
{
{
doSomething();
}
}
我试过这样做
sed -r -i -e 's/}\n+}/}\n}/g' file.txt
但无济于事。
我想删除右括号之间的换行符。
注意:我已经读过这个 How can I replace a newline (\n) using sed? 我也知道 N 命令,但我无法创建一个有效的 sed 表达式来实现我想要实现的目标。
您的确切意图并不明显。然而,如果你想使用多行正则表达式,你应该知道在它的经典形式中,sed 不打算一次处理多行(但是可能已经出现了一些多行版本的 sed)。您可以使用其他工具,例如 perl。我通常在需要时做的是以下工作流程:
tr '\n' 'µ' < myfile.txt | sed -e 's/µ}µ/}/' | tr 'µ' '\n'
(因为 µ 字符可以在我的键盘上使用,并且不太可能出现在我正在使用的文件中)。最初的 tr
命令从我的文件中生成一大行,第二个 tr
命令将换行符再次放在它们的初始位置。
使用 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 习惯用法,它将整个文件读入模式 space。 (如果您的文件很大,我们会考虑其他解决方案。)
s/}\n\n*}/}\n}/g
这只是您的替代命令,有一处更改:\n+
更改为 \n\n*
。这是因为 +
不是基本正则表达式下的活动字符。如果我们使用扩展的正则表达式,那么大括号 {
和 }
就会变成活动字符,这有可能导致此输入出现其他问题。
请注意,仅当第二个右大括号 }
出现在行首时,才会删除额外的换行符。
使用 awk:
awk -v RS='}' -v 'ORS=}' '!/{/{gsub(/\n+/,"\n")};1' file-name | head -n -1
我有这个示例文件
{
{
doSomething();
}
}
我想要实现的是:
{
{
doSomething();
}
}
我试过这样做
sed -r -i -e 's/}\n+}/}\n}/g' file.txt
但无济于事。
我想删除右括号之间的换行符。
注意:我已经读过这个 How can I replace a newline (\n) using sed? 我也知道 N 命令,但我无法创建一个有效的 sed 表达式来实现我想要实现的目标。
您的确切意图并不明显。然而,如果你想使用多行正则表达式,你应该知道在它的经典形式中,sed 不打算一次处理多行(但是可能已经出现了一些多行版本的 sed)。您可以使用其他工具,例如 perl。我通常在需要时做的是以下工作流程:
tr '\n' 'µ' < myfile.txt | sed -e 's/µ}µ/}/' | tr 'µ' '\n'
(因为 µ 字符可以在我的键盘上使用,并且不太可能出现在我正在使用的文件中)。最初的 tr
命令从我的文件中生成一大行,第二个 tr
命令将换行符再次放在它们的初始位置。
使用 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 习惯用法,它将整个文件读入模式 space。 (如果您的文件很大,我们会考虑其他解决方案。)
s/}\n\n*}/}\n}/g
这只是您的替代命令,有一处更改:
\n+
更改为\n\n*
。这是因为+
不是基本正则表达式下的活动字符。如果我们使用扩展的正则表达式,那么大括号{
和}
就会变成活动字符,这有可能导致此输入出现其他问题。请注意,仅当第二个右大括号
}
出现在行首时,才会删除额外的换行符。
使用 awk:
awk -v RS='}' -v 'ORS=}' '!/{/{gsub(/\n+/,"\n")};1' file-name | head -n -1