逃避一个字符串

时间:2009-04-18 03:40:47

标签: shell scripting escaping

我正在写一个shell脚本,我想转义一个字符串。有没有办法转换它:

I'm happy.
You're sad.

I\'m happy.\nYou\'re sad.

我很确定有sed / awk的某种组合可以做到这一点....

由于

5 个答案:

答案 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取代每个换行符