【问题标题】:Replace string in one file with contents of another file将一个文件中的字符串替换为另一个文件的内容
【发布时间】:2015-08-03 19:49:49
【问题描述】:

我正在寻找一个BASH 程序,我可以运行该程序将file2 中的匹配字符串替换为file1 中的所有内容。

所以 file2 看起来像这样:

define([
 'require'
  ****
 ],
 function(require){
 });

file1 看起来像:

, 'app/js/controllers/x'
, 'app/js/controllers/y'
, 'app/js/controllers/z'

是否有一个简单的BASH 脚本可以用来从file1 中复制3 行并将**** 字符串替换为file1 的内容,然后将结果写入file3.js?

【问题讨论】:

  • 我认为sed 可能是您在这里选择的工具。只需要弄清楚如何加载整个文件并将其插入某处。我去看看这个……
  • 是的,我看到了一些关于 sed 的东西......另一件事,你真的不需要 bash,我猜,你只需要读取文件,替换字符串,写入文件,即几乎可以用任何编程语言完成

标签: bash


【解决方案1】:

使用 sed

$ sed $'/[*][*][*][*]/{r file1\nd}' file2
define([
 'require'
, 'app/js/controllers/x'
, 'app/js/controllers/y'
, 'app/js/controllers/z'
 ],
 function(require){
 });

这会查找包含**** 的行。找到后,它会读取file,然后删除包含**** 的行。

使用 awk:

$ awk 'FNR==NR{s=s"\n"$0;next;} /[*][*][*][*]/{$0=substr(s,2);} 1' file1 file2
define([
 'require'
, 'app/js/controllers/x'
, 'app/js/controllers/y'
, 'app/js/controllers/z'
 ],
 function(require){
 });

第一个文件被读入变量s。当我们在第二个文件中看到**** 时,我们将其替换为第一个文件中的s

【讨论】:

    【解决方案2】:

    您可以逐行读取文件,如果您连续找到 4 颗星,而不是仅仅打印该行,cat 输出 file1。我使用tee 打印到newfile.txt 和终端。

    #!/bin/bash
    
    FILE1="file1.txt"
    FILE2="file2.txt"
    
    # read line by line
    while IFS=''  read -r line || [[ -n "$line" ]]; do
       # if we don't find 4 * in a row just print the line
       if [ $line != *"****"* ]; then 
            echo "$line"
       else
            cat $FILE1 # we found 4 stars, print the data from FILE1
       fi
    
    done < "$FILE2" | tee newfile.txt                           
    

    【讨论】:

      【解决方案3】:

      有一个简单的sed命令:

      sed -i '/\*\*\*\*/ { r file1\nd }' file2
      

      你告诉 sed 两件事:

      • 找到字符串****,读取file1并追加。

      • 删除字符串****。

      您需要花括号来连接订单。

      当 sed 匹配你的字符串/正则表达式时附加文件的内容:

      sed '/yourString/r fileToAppend' inputFile.
      

      删除一个字符串:

      sed '/yourStringToDelete/d' inputFile
      

      【讨论】:

      • 分号不是我写的。但是我最初没有正确地写它。您在答案中输入的“新行”符号是必要的。我将答案改为工作。谢谢。
      猜你喜欢
      • 2012-08-18
      • 2019-12-28
      • 2019-03-21
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 2011-07-01
      • 2016-05-23
      • 1970-01-01
      相关资源
      最近更新 更多