使用 bash 脚本将文件中的字符串替换为变量

使用 bash 脚本将文件中的字符串替换为变量

通过 bash 脚本,我尝试从文件中的文本中找到一个值 - 数字,然后创建一个新变量,然后用该文件中的字符串替换它。例如,在 /root/test.txt 中的文件中,我有一个字符串 web1,我需要将数字“1”剪切掉,然后将其增加 1,这样它将是 2,然后用 web2 替换 web1,这就是我到目前为止所做的,知道如何让它工作吗?

#!/bin/bash
m=grep 'web' /root/test.txt | awk '{print $2}'
i= $m | cut -c3
i=i+1
n='web$i'
$ sed -i 's/$m/$n/g' /root/test.txt

示例输入:

 project web0

示例输出:

 project web1

答案1

AWK 也可以搜索和替换文本,因此无需使用grepsed。下面的代码从第二列 ( webN) 中提取子字符串,增加N,并用 替换第二个字段webN+1

$ cat testInput.txt                                                                                          
project web0
other
project web1
$ awk '/web/{ num=substr($2,4)+1;$2="web"num };1' testInput.txt                                              
project web1
other
project web2

这将在屏幕上打印已编辑的文件。您可以将其保存到另一个文件,如下所示,awk [rest of code here] > fileName.txt并使用新文件替换原始文件mv fileName.txt oldFile.txt

答案2

使用 Perl:

perl -pe 's/\bweb\K[0-9]+\b/$&+1/ge' file

要就地编辑文件,请添加以下-i选项:

perl -i -pe 's/\bweb\K[0-9]+\b/$&+1/ge' file
  • -p:导致 Perl 假设您的程序周围有以下循环,这使得它像 sed 一样迭代文件名参数:

       LINE:
         while (<>) {
             ...             # your program goes here
         } continue {
             print or die "-p destination: $!\n";
         }
    
  • -e:可用于输入一行程序。
  • s/\bweb\K[0-9]+\b/$&+1/ge:匹配任何web以单词边界为前缀的字符串,丢弃该匹配并匹配后跟单词边界的一个或多个数字,用增加 1 的等效数字替换该匹配。
% cat file
project web0
project web1
project web2
% perl -pe 's/\bweb\K[0-9]+\b/$&+1/ge' file
project web1
project web2
project web3

答案3

谢谢大家,我试过这个代码,对我来说效果很好,

#!/bin/bash
DPATH="/root/test.txt"
k=$(grep 'web' $DPATH | awk '{print $2}')      # web ends by a number#
i=$(grep 'web' $DPATH | awk '{print $2}'| cut -c3)
m=$((i+1))
n="web$m"
sed -i -e 's/'"$k"'/'"$n"'/g' $DPATH

相关内容