特定字符串后替换文件路径文本

时间:2017-04-11 17:37:22

标签: bash awk sed terminal command

我有一个audacity.cfg文件,我想用脚本替换两个插件路径。路径以前是不同的,所以我需要插入更新的路径。我将在下面提供一个。

首先,我想找到这个文本,它开始讨论这一行:

FFmpegLibPath

接下来,我想用以下内容替换整行:

FFmpegLibPath = / Library / Application Support / audacity / libs / libavformat.55.dylib

就是这样。它应该不是那么困难,但确实如此。我已经使用sed和awk进行了大量的实验,但是还没有能够得到任何工作。虽然网上和本论坛都有大量的例子,但没有一个有效。它们都会产生与转义字符有关的错误,以及一些随机的其他事情。我花了几个小时进行实验和研究,但没有取得任何进展。

我意识到斜线和空格可能会引起问题,我花了相当多的时间来解决这个问题。我已经尝试了各种各样的东西,但正如我所说,没有任何作用。

有没有人对此有任何想法?

提前感谢您的帮助。

编辑: 我正在运行MacOS 10.10.5,我在研究中看到的一件事是使用GNU sed,因为有些参数在没有它的情况下不起作用。虽然我确信这会产生更好的结果,但我无法使用它,因为我的用户不会拥有它。我认为这是为什么这么困难的部分原因,因为我看到的许多解决方案都在利用我无法使用的论据。

2 个答案:

答案 0 :(得分:0)

您可以转义特殊字符(正斜杠)并将其分配给变量:

REPL=$(sed 's/[\/]/\\&/g' <<< "/Library/Application Support/audacity/libs/libavformat.55.dylib")

&是sed的元字符,用于表示匹配的模式。

sed -E "s/(FFmpegLibPath=).+/\1$REPL/" audacity.cfg

选项-E用于支持扩展正则表达式

输出:

etc
FFmpegLibPath=/Library/Application Support/audacity/libs/libavformat.55.dylib
etc
etc

如果您希望在单独的文本文件中维护更新:

cfg_update.txt
key_name1=value
key_name2=value
key_name3=value

# define delimiter
IFS=\=

cat cfg_update.txt | while read KEY VALUE; do
    sed -i -E "s/($KEY=).+/\1$VALUE/" audacity.cfg
done

选项-i用于编辑文件

最后,一定要在测试前做好备份,祝你好运!

答案 1 :(得分:0)

如果其他一切都失败了,你总是可以使用老派的ed解决方案。 :):)

#!/bin/bash
{
printf 'H\n'
printf '/^FFmpegLibPath[ \t=]/\n'
printf '%s\n' c 'FFmpegLibPath=/Library/Application Support/audacity/libs/libavformat.55.dylib' . w q
} | ed -s "/path/to/audacity.cfg" >/dev/null

引号,空格是强制性的。

以上搜索以FFmpegLibPath开头,后跟spacetab=的行。因此,它会尝试避免与类似前缀的冲突,例如:FFmpegLibPath2

如果无法进行此类碰撞,可以简单地将上述内容写成:

ed -s "/path/to/audacity.cfg" >/dev/null <<'EOF'
H
/^FFmpegLibPath/
c
FFmpegLibPath=/Library/Application Support/audacity/libs/libavformat.55.dylib
.
w
q
EOF

printf '%s\n' H '/^FFmpegLibPath/' c 'FFmpegLibPath=/Library/Application Support/audacity/libs/libavformat.55.dylib' . w q |
ed -s "/path/to/audacity.cfg" >/dev/null