2014-03-31 36 views
0

我有这样的代码文件来替换一个词:如何替换赛后的单词?

function replace_str { 
    echo "${1//${2}/${3}}" 
} 

myfile=$(cat input.txt) 
myfile=$(replace_str "$myfile" 'banana' 'stackoverflow') 
echo "$myfile" 

然后,与此内容在input.txt中:

banana 
poop 
poop 
poop 
banana 
START123 
poop 
banana 
banana 
poop 
START 6yu 
poop 
banana 

结果如下:

stackoverflow 
poop 
poop 
poop 
stackoverflow 
START123 
poop 
stackoverflow 
stackoverflow 
poop 
START 6yu 
poop 
stackoverflow 

而我正在寻找的是取代所有banana字,这是在第一个^START.*比赛后。这是所需的输出:

banana 
poop 
poop 
poop 
banana 
START123 
poop 
stackoverflow 
stackoverflow 
poop 
START 6yu 
poop 
stackoverflow 

什么是最有效的方法呢?我认为在切割文件,取代它,并再次合并,但我认为不是好主意。

+1

之前还是之后?从期望的输出看来,它应该是_after_。 – devnull

+0

是的,谢谢!发布编辑。 :) – harrison4

+2

将一个文件存储到一个变量然后尝试操作它并不是一个好主意。虽然这可能是一个很好的学术练习,但最好避免。 – devnull

回答

3

使用sed

sed '/^START.*/,${s/banana/stackoverflow/g}' inputfile 

这将替代bananastackoverflow从开头的行START开始直到文件的末尾。

它会产生:

banana 
poop 
poop 
poop 
banana 
START123 
poop 
stackoverflow 
stackoverflow 
poop 
START 6yu 
poop 
stackoverflow 
+0

谢谢!有用。但是我用它:'sed“/ function /,$ {s/$ var/$ foo/g}”'。但它会返回:'sed:-e表达式#1,字符11:意外',''我失踪了什么? – harrison4

+1

@JohnDoe假设'$ var'和'$ foo'被正确声明,你可能只需要转义'$ {'否则[tag:bash]会在'sed'之前展开它。 – BroSlow

2

对脚本的最快更改可能只是将文件循环。喜欢的东西

#!/bin/bash 
function replace_str { 
    echo "${1//${2}/${3}}" 
} 

match="START" 
found= 
while read -r line; do 
    [[ $line =~ ^"$match" ]] && found=: 
    [[ -n $found ]] && echo "$(replace_str "$line" 'banana' 'stackoverflow')" || echo "$line" 
done < input.txt 

样本输出

> ./abovescript 
banana 
poop 
poop 
poop 
banana 
START123 
poop 
stackoverflow 
stackoverflow 
poop 
START 6yu 
poop 
stackoverflow