用sed

时间:2018-05-09 14:41:56

标签: bash shell sed

我想用包含.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命令附加了文件beforeafter

提前感谢您的帮助!

注意:我使用的是Ubuntu 16.04和sed(GNU 4.2.2)。

1 个答案:

答案 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