我知道有许多类似的问题,例如(0)或(1),但我认为没有一个真正回答我想要的内容。
我想要的是将任何换行符(LF)替换为字符串
例如:
完全符合期望的结果,但正如我所说,我希望在仅有基本POSIX工具的环境下解决此问题(因此没有Perl或使用任何GNU扩展)。
提前感谢。
我想要的是将任何换行符(LF)替换为字符串
\n
,不会隐含任何换行符,且要使用仅基于POSIX的工具(无GNU扩展或Bashisms),并且从stdin中读取输入且不希望进行缓冲。例如:
printf 'foo' | magic
应该得到foo
printf 'foo\n' | magic
应该得到foo\n
printf 'foo\n\n' | magic
应该得到foo\n\n
- awk
printf 'foo' | awk 1 ORS='\\n
得到foo\n
,而实际上应该只得到foo
。
因此,在没有换行符的情况下添加了一个\n
。 - sed
对于仅有一个foo
的情况可以工作,但在所有其他情况下,例如:
printf 'foo\n' | sed ':a;N;$!ba;s/\n/\\n/g'
得到foo
,而实际上应该得到foo\n
缺少一个最终的换行符。
由于我不想进行任何形式的缓冲,也不能仅查看输入是否以换行符结尾,然后手动添加缺少的部分。
无论如何...它都将使用GNU扩展。
sed -z 's/\n/\\n/g'
确实可以工作(甚至正确地保留NULs),但是再次,这是GNU扩展。 - tr
只能替换为一个字符,而我需要两个字符。
perl -p -e 's/\n/\\n/'
完全符合期望的结果,但正如我所说,我希望在仅有基本POSIX工具的环境下解决此问题(因此没有Perl或使用任何GNU扩展)。
提前感谢。
printf 'foo\\n'
应该输出什么? - αғsнιηprintf 'foo'
的输出不是一个有效的 POSIX 文本文件(它缺少必需的终止换行符),因此任何 POSIX 文本处理工具在处理该输入时的行为都是未定义的。这意味着,如果你使用某个实现(例如 GNU)的 sed、awk 或其他工具来解决问题,即使在 POSIX 兼容模式下运行,也不能保证相同的解决方案适用于该工具的任何其他版本(例如 BSD),因为任何工具都可以对处理方式未定义的输入执行任何操作,并仍然符合 POSIX 标准。 - Ed Morton一个由零个或多个非<newline>字符组成的序列加上一个终止的<newline>字符。
请注意,对于POSIX文本行,需要一个终止的<newline>字符,因此POSIX文本文件中的每一行都必须以<newline>字符结尾,如果您输入到文本处理实用程序(例如sed或awk)的内容不是这样,则可能会有所不同。 - Ed Mortonfoo\n
。 - calestyo