转义字符串

5

我是一名shell脚本编写者,我希望转义一个字符串。有没有什么办法可以将这个字符串进行转换:

I'm happy.
You're sad.

为了

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

我很确定有一些sed/awk的组合可以做到这一点...
谢谢
5个回答

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.
============================

现在它对我也起作用了。我会删除我的旧评论,因为它们除了给当前答案带来混乱之外没有任何意义。 - mschilli
感谢您的输入,mschilli!如果您认为这个答案有用,请不要忘记给它评分! - Dmitri Sologoubenko
由于问题提到了 sed/awk,我假设更改是针对一个文件/流进行的。您的解决方案要求字符串位于 bash/环境变量中。因此,我不确定它是否真正实现了 OP 所要求的功能。 - mschilli
好的。我在OP的请求中没有看到文件或流的要求,sed/awk只是OP对可能解决方案的想法。该请求说明“我想转义一个字符串”,并且由于这是指Bash,对我来说,字符串要么是文字,要么是变量。此外,我建议这种解决方案的唯一原因是,与涉及外部命令(如sed或awk)的其他解决方案相比,它不需要运行其他进程来实现目标。无论如何,感谢您的输入,这有助于我改进我的答案。 - Dmitri Sologoubenko
我认为,通过仅使用“bash”在文件/流上执行操作的方法来展示如何实现这一点,可以进一步改进它。无论如何,您提出的原因值得一加。+1 - mschilli
显示剩余2条评论

0
尝试
sed 's/\\ /\\n/g' | sed 's/\\'/\\\'/g'

我可能在这里弄错了几个\。最好的方法是自己尝试。


1
你不必运行两个sed命令,你可以在一个sed调用中运行多个替换。我认为每个替换都以“;”字符结尾,但如果这不起作用,那就把这2行放在文件中,然后使用“sed -f <filename>”。 - slacy
1
@slacy:sed -e 's/foo/bar/g' -e 's/baz/qux/g' - Charles Duffy

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,另一次是为了awk,即"\\\'")。如果没有其他选项,则记录分隔符(RS)是换行符,但我将输出记录分隔符(ORS)设置为\n(再次对\进行转义以适应awk,即\\n)。

现在只需告诉awk重新计算每条记录(通过将$1设置为$1),没有任何变化,但awk认为记录已更改,有效地用OFS替换FS,因此用'代替\"。然后打印每个记录(这就是1模式所做的:对于所有记录,1为真,由于没有给出动作,执行标准操作{print $0}),有效地用ORS替换RS,因此用换行符代替\n。

0

这段代码可以将 ' 替换为 \'

echo "I'm happy. You're sad" | sed "s/'/\\\'/g"

你确定要用 \n 替换 "happy." 和 "You're" 之间的空格吗?\n 是一个换行符,但你原来的那行似乎没有换行符。

是的,他需要换行符“\n”,他只是弄乱了他的SO标记(Eddie已经修复了它)。 - derobert

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: 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接