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

Replace File Path Text After Specific String

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

首先,我想找到这段文字,它是问题行的开头:

FFmpegLibPath

接下来,我想将整行替换为:

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

就是这样。它不应该那么困难,但它确实如此。我已经使用 sed 和 awk 做了很多试验,但没有任何效果。虽然在线和本论坛中有很多这样的示例,但其中 none 个有效。它们都会产生与转义字符相关的错误,以及一些随机的其他东西。我花了几个小时进行实验和研究,但没有取得任何进展。

我意识到斜杠和空格可能会导致问题,我已经花了相当多的时间来尝试解决这个问题。我尝试了各种方法,但正如我所说,没有任何效果。

有人对此有什么想法吗?

在此先感谢您的帮助。

编辑: 我是 运行 MacOS 10.10.5,我在研究中看到的其中一件事是使用 GNU sed,因为没有它某些参数就无法工作。虽然我确信这会产生更好的结果,但我不能使用它,因为我的用户不会拥有它。我认为这是如此困难的部分原因,因为我看到的许多解决方案都使用了我无法使用的参数。

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

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

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

sed -E "s/(FFmpegLibPath=).+/$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=).+/$VALUE/" audacity.cfg
done

选项-i用于就地编辑文件

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

如果其他方法都失败了,您始终可以使用老式 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