通过 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 也可以搜索和替换文本,因此无需使用grep
或sed
。下面的代码从第二列 ( 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