bashスクリプトを使用して、ファイル内のテキストからvalue-number-を見つけて、新しい変数を作成してから、そのファイル内の文字列などに置き換えようとしています。 /root/test.txtのファイルでは、文字列web1を持っています。数字の「1」を切り、1を増やして2になるようにし、web1をweb2に置き換えます。それを機能させる方法は?
#!/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
AWKはテキストも検索および置換できるため、grep
またはsed
を使用する必要はありません。次のコードは、2番目の列(webN
)から部分文字列を抽出し、N
をインクリメントし、2番目のフィールドを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
を使用して元のファイルを新しいものに置き換えることができます。
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
:プログラムの1行を入力するために使用できます。s/\bweb\K[0-9]+\b/$&+1/ge
:Word境界の前にあるweb
文字列に一致し、一致を破棄し、Word境界に続く1つ以上の数字に一致し、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
おかげで、私はこのコードを試してみましたが、それは私のためにうまくいきました、
#!/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