我有一个.txt文件,如下所示:
HelloWorld (3,4,5)
FooFooFoo {34,34,34}{23,1,2}
BarFooHello {{4,5,12}}
BarBar Bar
HelloFoo {{6,5}} 我希望在文件中找到字符串'BarFooHello‘,并将开始字符串’{‘{’与'BarFooHello‘}’}‘之间的任何字符串替换为'12,12,12,12’‘。目标是在最后获得一个文件--这个文件:
HelloWorld (3,4,5)
FooFooFoo {34,34,34}{23,1,2}
BarFooHello {{12,12,12,12}}
BarBar Bar
HelloFoo {{6,5}} 如何在bash中实现这一点?,我希望在bash中有一个函数,它接受1)起始字符串2)结束字符串,3)应该执行修改的字符串,4)替换当前存在于起始字符串和结束字符串之间的字符串。
发布于 2015-01-28 05:26:42
$ sed '/^BarFooHello/ s/{{.*}}/{{12,12,12,12}}/' file.txt
HelloWorld (3,4,5)
FooFooFoo {34,34,34}{23,1,2}
BarFooHello {{12,12,12,12}}
BarBar Bar
HelloFoo {{6,5}} 它是如何工作的
sed循环文件中的每一行。
/^BarFooHello/
这只选择以BarFooHello开头的行。s/{{.*}}/{{12,12,12,12}}/
在选定的行中,这将替换该行上的第一个{{和最后一个}}之间的所有内容,并将其替换为{{12,12,12,12}}。发布于 2015-01-28 06:04:36
使用sed,您可以:
funct ()
{
start=$1 # "BarFooHello"
begin=$2 # "{{"
end=$3 # "}}"
string=$4 # "12,12,12,12"
file=$5 # The file to perform the replacement
sed "s/^$start $begin[[:print:]]*$end/$start $begin$string$end/g" $file # Sensitive to 3 spaces
# or
sed "s/^$start\(\ *\)$begin[[:print:]]*$end/$start\1$begin$string$end/g" $file # Preserve the amount of spaces
}并被这样使用:
funct "BarFooHello" "{{" "}}" "12,12,12,12" test.txt发布于 2015-01-28 05:28:32
纯巴什:
#!/bin/bash
repl () {
line="$1"
str="$2"
pre="$3"
suf="$4"
values="$5"
if [[ $line =~ ^$str ]]; then
line="${line/%$pre*$suf/$pre$values$suf}"
fi
echo "$line"
}
while read line; do
repl "$line" BarFooHello "{{" "}}" 12,12,12,12
done < file函数一次工作在一行文本上,并仅在该行与字符串匹配的情况下替换。
Bash没有反向引用的机制,这需要冗余。${line/%$pre*$suf/$pre$values$suf}用前缀字符串、新值和后缀字符串替换从前缀字符串到后缀的所有内容。
https://stackoverflow.com/questions/28184695
复制相似问题