我是一名shell脚本编写者,我希望转义一个字符串。有没有什么办法可以将这个字符串进行转换:
I'm happy.
You're sad.
为了
I\'m happy.\nYou\'re sad.
我很确定有一些
sed
/awk
的组合可以做到这一点...谢谢
#!/bin/bash
X="I'm happy.
You're sad."
echo "========== BEFORE =========="
echo "${X}"
echo "========== AFTER ==========="
X="${X//\'/\\\'}"
X="${X//$'\n'/\\n}"
echo "${X}"
echo "============================"
========== BEFORE ==========
I'm happy. You're sad.
========== AFTER ===========
I\'m happy.\nYou\'re sad.
============================
sed 's/\\ /\\n/g' | sed 's/\\'/\\\'/g'
我可能在这里弄错了几个\
。最好的方法是自己尝试。
这是我使用 awk
的解决方案:
$ awk '{$1=$1}1' FS=\' OFS="\\\'" ORS='\\n' <<< "I'm happy.
You're sad."
这将导致输出
I\'m happy.\nYou\'re sad.\n
解释:
我将字段分隔符(FS
)设置为'
(用\'
转义它以适应shell
),并将输出字段分隔符(OFS
)设置为\'
(用"..."
包装以适应shell
并对\
进行两次转义,一次是为了shell
,另一次是为了awk
,即"\\\'"
)。如果没有其他选项,则记录分隔符(RS
)是换行符,但我将输出记录分隔符(ORS
)设置为\n
(再次对\
进行转义以适应awk
,即\\n
)。
这段代码可以将 '
替换为 \'
。
echo "I'm happy. You're sad" | sed "s/'/\\\'/g"
\n
替换 "happy." 和 "You're" 之间的空格吗?\n
是一个换行符,但你原来的那行似乎没有换行符。我认为这是你想要的。在sed
命令中,操作的顺序非常关键。请注意,这也处理字符串中的反斜杠(以及单引号)(我的PS1提示符为Osiris JL:
):
Osiris JL: cat zzz
xxx="I'm happy.
You're sad."
yyy=$(echo "$xxx" | sed 's/[\'\'']/\\&/g;s/$/\\n/;$s/\\n$//')
echo "$xxx"
echo $xxx
echo "$yyy"
echo $yyy
#eval echo $yyy
#eval echo "$yyy"
Osiris JL: sh zzz
I'm happy.
You're sad.
I'm happy. You're sad.
I\'m happy.\n
You\'re sad.
I\'m happy.\n You\'re sad.
Osiris JL:
sed
/awk
,我假设更改是针对一个文件/流进行的。您的解决方案要求字符串位于bash
/环境变量中。因此,我不确定它是否真正实现了 OP 所要求的功能。 - mschilli