将换行符转换为实际字符串

时间:2014-10-31 18:22:23

标签: regex awk sed string-matching tr

我有一个这样的文件:

#!/bin/bash
echo $(date "+%F %R:%S") ":: yum update"
/usr/bin/yum update -y

我想将其转换为此引号字符串:

"#!/bin/bash\necho $(date \"+%F %R:%S\") \":: yum update\"\n/usr/bin/yum update -y\n"

我使用的任何方法都是匹配换行符,但将它们转换为换行符而不是“\ n”。所以这些例子:

sed 's/\n/\n/g' file
sed 's/\n/\\\n/g' file
tr '\n' '\n' <file
tr '\n' "\n" <file

所有结果都与文件本身完全相同。那么我如何匹配换行符并将其替换为实际的字符串“\ n”而不是将其自身识别为换行符?

2 个答案:

答案 0 :(得分:0)

在这里,您需要两个字符(斜杠和n)来替换单个换行符。因此,tr不是一个好的选择。

我不清楚你是否想在双引号之前加上实际的反斜杠。下面的答案假设你这样做。如果不这样做,那么删除那些替换就足够了。

使用awk

$ awk '{gsub(/"/, "\\\""); printf "%s\\n",$0}' file
#!/bin/bash\necho $(date \"+%F %R:%S\") \":: yum update\"\n/usr/bin/yum update -y\n

使用sed

$ sed ':again; N; $!b again; s/"/\\"/g; s/\n/\\n/g; s/$/\\n/' file
#!/bin/bash\necho $(date \"+%F %R:%S\") \":: yum update\"\n/usr/bin/yum update -y\n

答案 1 :(得分:0)

的Perl:

perl -0777 -pe 's/\n/\\n/g; s/"/\\"/g' file

tr无法完成此工作,因为它无法将一个字符( \ n )转换为2字符串字符串( \ n )。