我想用包含.ly文件的文件夹中的其他字符串替换一些字符串(.ly文件是用于编写音乐的文件,然后可以将其转换为svg文件)。一个问题是文件包含反斜杠(\)。
无论如何,我想要做的是替换以下字符串:
\f with \fffff
\p with \ppppp
mordent with reverseturn
r4 with \mordent
我要替换的每个字符串(以及替换它的每个字符串)最后都有一个空格。这是因为我不想要像
这样的字符串\pt to be replaced with \pppppt
同样,因为反斜杠很重要,所以像
这样的字符串\ff should stay the same (only f with a slash before and a space after should be replaced).
我用来实现此目的的代码是:
for f in *.ly
do
filename="${f}"
sed -i -- "s@\p @\ppppp @g; s@\f @\fffff @g; s@mordent @reverseturn @g; s@r4 @\maxima @g" $filename;
done
我正在使用分隔@而不是反斜杠来实现此目的。
然而,该计划正在给出一些非常奇怪的行为。特别是:
\f stays the same (wrong behavior, the right behavior is to get transformed to \fffff)
\p is converted to \ppppp (correct behavior)
\stemUp is converted to \stemUppppp (wrong behavior, the right behavior is to remain as it was)
这令我感到困惑并让我头疼。特别是,为什么它适用于\ p但不适用于\ f,因为它是完全相同的代码。
作为参考,我使用sed命令附加了文件before和after。
提前感谢您的帮助!
注意:我使用的是Ubuntu 16.04和sed(GNU 4.2.2)。
答案 0 :(得分:3)
$ echo '12p3 p \p foo' | sed 's/\p /\ppppp /g'
12p3 ppppp \ppppp foo
$ echo '12p3 p \p foo' | sed 's/\\p /\\ppppp /g'
12p3 p \ppppp foo
\
是一个元字符,要按字面意思匹配,需要对其进行转义,即\\
\
在双引号中也是特殊的(因为bash,与sed无关) - 所以除非需要,否则不要使用双引号(例如sed substitution with bash variables)。另请参阅Difference between single and double quotes in Bash