替换特定字符串后的文件路径文本
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
开头且后跟 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
我有一个 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
开头且后跟 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