我正在写一个shell脚本,我想转义一个字符串。有没有办法转换它:
I'm happy.
You're sad.
到
I\'m happy.\nYou\'re sad.
我很确定有sed
/ awk
的某种组合可以做到这一点....
由于
答案 0 :(得分:1)
您可以使用普通Bash(参见http://tldp.org/LDP/abs/html/string-manipulation.html)。
类似的东西:
#!/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.
============================
答案 1 :(得分:0)
试
sed 's/\\ /\\n/g' | sed 's/\\'/\\\'/g'
我可能在这里弄乱了几个\
。最好的方法是亲自尝试。
答案 2 :(得分:0)
这适用于将'
替换为\'
。
echo "I'm happy. You're sad" | sed "s/'/\\\'/g"
您确定要替换“快乐”之间的空格吗?并且“你是”与\n
? \n
是换行符,但您的原始行似乎没有新行。
答案 3 :(得分:0)
我认为这就是你所追求的。 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:
答案 4 :(得分:0)
以下是我使用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
{1}}和awk
的第二次,"\\\'"
)。没有其他选项,记录分隔符(RS
)是换行符,但我将输出记录分隔符(ORS
)设置为\n
(再次转义为\
的{{1}}为awk
)。
现在唯一告诉\\n
要做的就是重新计算每条记录(通过将awk
设置为$1
,没有任何变化,但$1
认为记录已更改,有效地将awk
替换为FS
,因此每OFS
替换'
}并打印每条记录(这是\'
模式的作用:{{ 1}}对于所有记录都是如此,因为没有给出任何操作,标准操作1
被执行),有效地用1
替换{print $0}
,因此RS
取代每个换行符