【问题标题】:Replace File Path Text After Specific String在特定字符串之后替换文件路径文本
【发布时间】:2017-09-07 05:50:07
【问题描述】:

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

首先,我想找到这个文本,它以有问题的行开头:

FFmpegLibPath

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

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

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

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

有人对此有任何想法吗?

提前感谢您的帮助。

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

【问题讨论】:

  • 添加至少一个实验示例...否则,这只是给我一个解决方案类型的问题... ;(
  • 很公平 - 这是我尝试的最后一个: sed -e 's/:: FFmpegLibPath = [0-9]+$/:: FFmpegLibPath = 's#FFmpegLibPath=/Library /应用程序支持/audacity/libs/libavformat.55.dylib#g' audacity.cfg

标签: bash awk sed terminal command


【解决方案1】:

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

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

&amp; 是 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用于就地编辑文件

最后,请务必在测试前做好备份,祝你好运!

【讨论】:

  • 我是否需要将这部分制作成更大的表达式或脚本以容纳多行?
  • 如果有多个更新,您可能希望将它们保存在一个文本文件中。如答案所示示例(不能在评论中构造脚本)
  • 在这个特定的例子中,只有两个变化,但它肯定有可能在未来对需要更大变化的事情有用。我在 Firefox 配置文件更新项目中使用了类似的 cat 脚本,但我需要做的只是将新行放在末尾,然后 Firefox 将在第一次打开文件时对其进行修剪和重新排序。
【解决方案2】:

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

【讨论】:

  • 第一个成功了!惊人的!但是,当我尝试第三个时,它无法识别目标文件路径。它吐出“没有这样的文件或目录。”
  • 我希望在配置文件中替换的项目只有一个实例,但是在替换用户配置文件中的内容时,我喜欢谨慎行事。
  • 然后使用第一个。模式为FFmpegLibPath,后跟spacetab= 之一。
  • 删除我之前关于第三个命令找不到路径的评论 - 这是我的错误。我纠正了我的错误,它工作得很好!非常感谢这些!
  • @SadMarvin 享受 ;)
猜你喜欢
  • 2013-07-17
  • 2020-03-06
  • 2021-05-09
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
相关资源
最近更新 更多