我正在寻找一个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?
答案 0 :(得分:5)
$ sed $'/[*][*][*][*]/{r file1\nd}' file2
define([
'require'
, 'app/js/controllers/x'
, 'app/js/controllers/y'
, 'app/js/controllers/z'
],
function(require){
});
这将查找包含****
的行。找到后,会显示file
,然后删除包含****
的行。
$ 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