首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash:找到一个模式并替换下面的内容

Bash:找到一个模式并替换下面的内容
EN

Stack Overflow用户
提问于 2015-01-28 04:36:18
回答 3查看 76关注 0票数 1

我有一个.txt文件,如下所示:

代码语言:javascript
运行
复制
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’‘。目标是在最后获得一个文件--这个文件:

代码语言:javascript
运行
复制
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)替换当前存在于起始字符串和结束字符串之间的字符串。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-28 05:26:42

代码语言:javascript
运行
复制
$ 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}}
票数 1
EN

Stack Overflow用户

发布于 2015-01-28 06:04:36

使用sed,您可以:

代码语言:javascript
运行
复制
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
}

并被这样使用:

代码语言:javascript
运行
复制
funct "BarFooHello" "{{" "}}" "12,12,12,12" test.txt
票数 1
EN

Stack Overflow用户

发布于 2015-01-28 05:28:32

纯巴什:

代码语言:javascript
运行
复制
#!/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}用前缀字符串、新值和后缀字符串替换从前缀字符串到后缀的所有内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28184695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档