我有一个文件,其中包含\n的几个实例。
我想用实际的换行符替换它们,但 sed 无法识别\n。
我试过了
sed -r -e 's/\n/\n/'
sed -r -e 's/\\n/\n/'
sed -r -e 's/[\n]/\n/'
以及许多其他逃避它的方法。
sed 能够识别文字\n吗?如果是这样,如何?
是否有另一个程序可以读取将\n解释为真正的换行符的文件?
我有一个文件,其中包含\n的几个实例。
我想用实际的换行符替换它们,但 sed 无法识别\n。
我试过了
sed -r -e 's/\n/\n/'
sed -r -e 's/\\n/\n/'
sed -r -e 's/[\n]/\n/'
以及许多其他逃避它的方法。
sed 能够识别文字\n吗?如果是这样,如何?
是否有另一个程序可以读取将\n解释为真正的换行符的文件?
你能试试这个吗
sed -i 's/\\n/\n/g' input_filename
确切的工作取决于您的sed实施。这在 POSIX 中没有明确规定,因此您会看到各种行为。
该-r选项也不是 POSIX 标准的一部分;但是您的脚本没有使用任何-r功能,所以让我们把它拿出来。(对于它的价值,它将匹配表达式中支持的正则表达式方言从 POSIX“基本”正则表达式更改为“扩展”正则表达式;一些sed变体具有-E执行相同操作的选项。简而言之,诸如捕获括号和重复大括号之类的事情是“扩展”功能。)
在 BSD 平台(包括 MacOS)上,您通常需要反斜杠文字换行符,如下所示:
sed 's/\\n/\
/g' file
在其他一些系统上,比如 Linux(也取决于sed安装的精确版本——一些发行版使用 GNU sed,另一些更喜欢更传统的东西,还有一些让你选择)你可以\n在替换字符串中使用文字来表示实际换行符;但同样,这是非标准的,因此不可移植。
如果您需要一个可移植的解决方案,可能会使用 Awk 或(喘气)Perl。
perl -pe 's/\\n/\n/g' file
如果您无权访问手册,则该/g标志表示要替换一行中的每个匹配项;该s///命令的默认行为是仅替换每一行的第一个匹配项。
sed一次工作一行,因此\n仅在 1 行上不工作(在读取时将其删除sed到缓冲区中)。您应该使用N,n或H,h用多行填充缓冲区,然后\n出现在里面。小心,由于内部^,$不再是行尾而是字符串/缓冲区的结尾\n。\n在搜索模式中被识别,而不是在替换模式中。两种使用方式(示例):
sed s/\(\n\)bla/\1blabla\1/
sed s/\nbla/\
blabla\
/
第一个使用\n已经在内部作为后向引用(替换模式中的代码较短);第二个使用真正的换行符。所以基本上
sed "N
$ s/\(\n\)/\1/g
"
有效(但有点没用)。我想这s/\(\n\)\n/\1/g更像是你想要的。
awk似乎处理得很好:
echo "test \n more data" | awk '{sub(/\\n/,"**")}1'
test ** more data
在这里你需要逃避\使用\\
$ echo "\n" | sed -e 's/[\\][n]/hello/'