2

あるファイルの1つの文字列を別のファイルの文字列に置き換えたいのですが。私はこれらのコマンドの経験はありませんが、grepとsedの組み合わせが最適だと思います。

これをもう少し複雑にしているのは、どちらの文字列もわからないことです(ドキュメントのバージョン番号の置き換えを自動化しようとしています)。どちらの場合も、探している文字列(たとえば、「2.3.4」)の前に「version:」が付いていることを私は知っています。

したがって、「version:」(string1と呼びましょう)の後に単語(または行の残りの部分など)を探し、別のファイルで同じことを行い(string2を指定)、stringstring1をstring2に置き換えます。

テキストファイルの例を次に示します。

file1.txt


これは、更新されたバージョン番号を含むファイルです。
バージョン:2.3.4
ここに詳細が記載された文字列があります

file2.txt

これは構成ファイルです
。古いバージョン番号の
バージョンが含まれている可能性があります。2.3.2
これを更新してください

したがって、file2.txtの期待される出力は次のようになります。

file2.txt

これは構成ファイルです
。古いバージョン番号の
バージョンが含まれている可能性があります。2.3.4
これを更新してください

ありがとう

4

2 に答える 2

2

オプションsedをサポートするがあれば、-i

sed -i 's/version: .*/version: 1.2.3/' file1 file2 file3 ...

正規表現のワイルドカードを微調整することをお勧めします。.*行の終わりまで一致し[.0-9]*ますが、ドットと数字の可能な限り長いシーケンスに一致します。また、周囲の空白のバリエーションを許可することもできます...しかし、これはおそらくこのサイトの上位10%のFAQに含まれているため、この時点で同様の質問を探してください。

file1から置換文字列を取得し、それをfile2、file3などに適用するには、次のようにします。

new=$(sed -n 's/version: //p' file1)
# Use double quotes, not single, in order to expand $new
sed -i "s/version: [.0-9]*/version: $new/" file2 file3 ...

最初のsed呼び出しでは、「version:」が見つかって削除された(空の文字列に置き換えられた)行のみが出力されます。おそらく、ファイルにはそのような行が1つだけあります。head -n 1出力をまたはuniqまたは何かにパイプするか、より複雑なsedスクリプトを見つけて作成します。

通常、リテラル文字列を一重引用符で囲みますが、置換にリテラルが必要ないため、$new二重引用符を使用します。これにより、シェルで変数置換(およびここでは取り上げない他の多くの置換)を実行できます。引用符で囲まれた文字列。

于 2012-07-18T08:17:39.270 に答える
2

これでよろしいですか?

kent$  head f1 f2
==> f1 <==
This is a file containing
the updated version number.
version: 2.3.4
here is a string with more info

==> f2 <==
This is a configuration file
It could contain an old version number
version: 2.3.2
Please update this

kent$  awk 'NR==FNR{if($0~/^version:/){x=$0;} next;}{gsub(/^version:.*$/,x);print $0}' f1 f2
This is a configuration file
It could contain an old version number
version: 2.3.4
Please update this
于 2012-07-18T09:23:40.620 に答える