shell脚本中利用正则表表达式替换一个文本里面的指定逻辑内容

例如在linux环境中,有一个文本1.txt,内容如下
aaaaa bbbbb "(3 1) xxxxxxxxx
aaaaa bbbbb "(5 1) xxxxxxxxx
aaaaa bbbbb "(6 1) xxxxxxxxx
aaaaa bbbbb "(7 1) xxxxxxxxx

现在需要把文件中括号内第一个数字大于5的全部加1,并且输出文件,并且这种文件很多的时候,手动改就很费时费力,这种时候,就得利用脚本去实现了,shell脚本其实不是很熟悉,这里记录下:

inputfilte="1.txt"
tempfile="2.txt"
while IFS= read -r line; do
              if [[ $line == *"hello world"* ]]; then
                x=$(echo "$line" | grep -oP '(?<=aaaaa bbbbb \"\()\d(?= \d)')
                if ((x > 2)); then
                  new_x=$((x + 1))
                  line=$(echo "$line" | sed "s|aaaaa bbbbb \"($x|aaaaa bbbbb \"($new_x|")
                fi
              fi
              echo "$line"
            done < "$inputfilte" > "$tempfile"
        
            mv "$tempfile" "$inputfilte"

代码中有几个地方需要注意:

  • 1、grep -oP,是使用Perl 正则表达式进行匹配,比 grep -oE更好用一些。
  • 2、利用sed替换掉对应位置的字符,sed 之后的符号最好用双引号,这样能正确的识别$+变量名,例如上述代码$x和$new_x;
    代码的逻辑很简单,就是遍历一个文件的每一行,按照逻辑处理完每一行字符串之后先输出到一个临时文件,然后使用mv命令,将临时文件改名。

你可能感兴趣的:(linux,shell,linux,服务器)