我有一个audacity.cfg文件,我想用脚本替换两个插件路径。路径以前是不同的,所以我需要插入更新的路径。我将在下面提供一个。
首先,我想找到这个文本,它开始讨论这一行:
FFmpegLibPath
接下来,我想用以下内容替换整行:
FFmpegLibPath = / Library / Application Support / audacity / libs / libavformat.55.dylib
就是这样。它应该不是那么困难,但确实如此。我已经使用sed和awk进行了大量的实验,但是还没有能够得到任何工作。虽然网上和本论坛都有大量的例子,但没有一个有效。它们都会产生与转义字符有关的错误,以及一些随机的其他事情。我花了几个小时进行实验和研究,但没有取得任何进展。
我意识到斜线和空格可能会引起问题,我花了相当多的时间来解决这个问题。我已经尝试了各种各样的东西,但正如我所说,没有任何作用。
有没有人对此有任何想法?
提前感谢您的帮助。
编辑: 我正在运行MacOS 10.10.5,我在研究中看到的一件事是使用GNU sed,因为有些参数在没有它的情况下不起作用。虽然我确信这会产生更好的结果,但我无法使用它,因为我的用户不会拥有它。我认为这是为什么这么困难的部分原因,因为我看到的许多解决方案都在利用我无法使用的论据。
答案 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
开头,后跟space
或tab
或=
的行。因此,它会尝试避免与类似前缀的冲突,例如: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