将一个文件中的字符串替换为另一个文件的内容

时间:2015-08-02 21:19:03

标签: bash

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

所以file2看起来像这样:

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

file1看起来像:

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

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

3 个答案:

答案 0 :(得分:5)

使用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

答案 1 :(得分:1)

您可以逐行读取文件,如果您连续找到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                           

答案 2 :(得分:1)

有一个简单的sed命令:

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

你告诉sed两件事:

  • 查找字符串****,读取文件1并追加它。

  • 删除字符串****。

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

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

sed '/yourString/r fileToAppend' inputFile.

删除字符串:

sed '/yourStringToDelete/d' inputFile