0

これを行うための小さな Python スクリプトを作成できると思いますが、シェルだけを使用してこの種のことを行う方法を学ぼうとしています。

基本的に私はこのようなものを持っています:

データベース.txt:

line1|tag1
line2|tag1
line3|tag2
line4|tag1

lines_to_change.txt:

line1
line4

what_i_want.txt:

line1|tag2
line2|tag1
line3|tag2
line4|tag2

したがって、基本的には、lines_to_change.txtファイル内の各行に対して、その行のタグを から に変更する必要がtag1ありますtag2。これはコマンドラインの仕事だと言われましたがsed、マニュアルの周りに道が見つかりません。

ありがとう。

4

4 に答える 4

1

これは、tag1 と tag2 を切り替えるソリューションです。

(したがって、tag1 の場合は tag2 に変更され、tag2 の場合は tag1 に変更されます。) 中間タグ「tag3」(これを何と呼ぶか​​は関係ありません) を中心にヒンジで固定されていますが、トグルすることができます。既存のタグの状態を知らなくても。file2.txt にはトークンがあり、file1.txt はデータベース ファイルです (-i コマンドはその場で追加します)。

cat file2.txt | xargs -I '{}' sed -i 's/{}|tag1/{}|tag3/gp;s/{}|tag2/{}|tag1/gp;s/{}|tag3/{}|tag2/gp' file1.txt

覚えておいていただきたいことの 1 つは、次の文字列を介して、あるコマンドの出力を別のコマンドの入力に渡す機能です。

| xargs -I '{}'

これにより、非常に強力なコマンド ライン ユーザーになります。

編集:

すべての tag1 を tag2 に単純に変更する場合は、次のようにします。

cat file2.txt | xargs -I '{}' sed -i 's/{}|tag1/{}|tag2/gp' file1.txt
于 2013-03-05T19:16:15.150 に答える
1

これを試して

cat lines_to_change.txt | xargs -I '{}' sed -i 's/{}|tag1/{}|tag2/g' database.txt 

database.txt結果はそれ自体に保存されます

于 2013-03-05T18:26:28.027 に答える
0

最初に、lines_to_change.txt ファイルで sed を使用して、別の sed スクリプトを作成します。

sed 's;.*;/&/s/tag1/tag2/;' lines_to_change.txt > lines_to_change.sed

次に、その新しいコマンド ファイルを使用して元のファイルを編集します。

sed -f lines_to_change.sed database.txt > what_i_want.txt
于 2013-03-05T18:33:39.730 に答える
0
awk 'NR==FNR { a[$0]; next } 
    $1 in a{ $2 = "tag2" } 1' FS=\| OFS=\| lines_to_change.txt input.txt
于 2013-03-05T19:28:06.807 に答える