【问题标题】:Replace a variable with the name of the file in Bash用 Bash 中的文件名替换变量
【发布时间】:2014-10-01 00:39:38
【问题描述】:

我有一个场景,我需要用该文件名替换目录内多个文件中的变量(同一个变量)。

例如,我有一个内容相同的文件列表;

文件1 文件2 文件 3 文件4

每个文件的内容是;

Some Text
Another line of text
I need to replace this $variable

我想做的是将模式 $variable 的所有实例替换为所述文件的名称。

即file1 的内容会变成

Some Text
Another line of text
I need to replace this file1

file2的内容会变成

Some Text
Another line of text
I need to replace this file2

我一直在研究 sed,并认为这可能是要走的路,但我在脚本编写方面经常出错,这当然不是一个强项。

【问题讨论】:

    标签: bash shell sed scripting find


    【解决方案1】:

    你可以使用这个 for 循环:

    while read -r f; do
       sed -i.bak "s~\$variable~$f~" "$f"
    done < <(grep -l '\$variable' file*)
    

    如果您想对目录中的每个文件执行此操作,请将 glob 模式 file* 更改为 *

    【讨论】:

    • 很可爱!太好了,谢谢伙计。请原谅我的无知,但我如何让它真正更新有问题的文件,而不是仅仅输出到屏幕上? - 非常感谢您的快速响应!
    • 我认为/ 可能会产生冲突。最好使用另一个分隔符。
    • 是的,文件名中的/ 会出现问题,就像s/// 的替换部分中的任何其他神奇字符一样。
    • @user3919278:检查更新的命令,它现在将进行内联编辑而不是写入标准输出。 konsolebox:谢谢伙计,我现在用~作为分隔符。
    • g 如果 OP 在同一行中有多次 $variable,则需要添加。
    【解决方案2】:

    使用 GNU awk 进行就地编辑和单词锚点:

    awk -i inplace '{gsub(/\<\$variable\>/,FILENAME); print}' file*
    

    对于包含&amp;\\&lt;number&gt; 的文件名,上述操作将失败。如果这是一个问题,解决方案是使用 match() 或 index() 和 substr() 而不是 gsub()。

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2013-12-10
      • 2020-08-14
      • 2019-03-28
      • 1970-01-01
      • 2011-12-02
      • 2021-11-20
      • 2022-11-11
      • 2015-01-29
      相关资源
      最近更新 更多