インラインファイルのフィールドを置き換える

インラインファイルのフィールドを置き換える

次の内容を含むファイル(a.txt)があります。

Redhat master 12345678 V1A 20.0/20.0.1
Windows slave 12345678 V1B 19.0/19.0.1

「master」という単語を含む行を特定し、4番目と5番目のフィールドを新しい値に置き換えたいと思います。

たとえば、新しいa.txtは次のようになります。

Redhat master 12345678 V1B 20.0/20.0.2
Windows slave 12345678 V1B 19.0/19.0.1

ここで、「V1A」は「V1B」に置き換えられ、「20.0/20.0.1」は「20.0/20.0.2」に置き換えられる。

誰でもこれを達成するのに役立ちますか?

また、新しい値をスクリプトパラメータとして渡したいと思います。

新しい値をスクリプトにパラメータとして渡すことはできますか?次のスクリプトを試しています。

スクリプト(test.sh)の内容は次のとおりです。

#!/bin/bash

if [ "$2" == "" ]; then
    echo usage: $0 \<version\> \<revision\>
    exit -1
else
   version=$1
   revision=$2
fi
awk '/master/{$4="$1";$5="$2"}' a.txt >newa.txt

私が実行したとき:

#bash test.sh V1B 20.0/20.0.2

動作しません。

答え1

そしてawk

awk '/master/{$4="V1B";$5="20.0/20.0.2"};1' a.txt

まず、「master」という単語を含む行を検索してから、4番目()および5番目()フィールド/master/の値を置き換えます。結局、すべてを印刷します。$4$51

編集する:

-v新しい値をパラメータとして渡すには、switch inを使用する必要がありますawk。たとえば、次のようになります。

x="V1B"
y="20.0/20.0.2"
awk -v VAR1="$x" -v VAR2="$y" '/master/{$4=VAR1;$5=VAR2};1' a.txt

(しかし、これらの変数にバックスラッシュが含まれていると正しく機能しません。)

答え2

並んで

 awk '/master/{$4="$1";$5="$2"}' a.txt >newa.txt

「$1」はシェルから渡された値を保存しません。

あなたは書かなければなりません

awk '/master/{$4="'$1'";$5="'$2'"}' a.txt > newa.txt

このようにして、$ 1 frm呼び出しシェルはawkファイルに保存されます。

関連情報