我有一个文件,其中包含\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/'