2013-03-05 75 views
0

我想我可以寫一個小python腳本來做到這一點,但我想學習如何使用shell來做這種事情,因爲我認爲它更有意義。sed命令改變部分線

基本上,我有這樣的事情:

database.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的工作,但無法找到我的方式圍繞男子文件。

謝謝。

回答

1

試一下這個

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

結果將被保存到database.txt本身

+0

注意'-i'由GNU過時'xargs'和不支持由BSD版本。改用'-I'{}''。 – chepner 2013-03-05 18:33:53

+0

謝謝你先生。 @chepner – 2013-03-05 18:34:45

0

首先用sed您lines_to_change.txt文件創建另一個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 
1

下面是在tag1和tag2之間切換的解決方案。如果它是tag1,它會將它更改爲tag2,如果它是tag2,則它會將其更改爲tag1。)它圍繞一箇中間標籤「tag3」(不管您稱之爲什麼),但是它是由一箇中間標籤「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 

一件事,我懇求你承諾記憶是通過輸出能力一個命令通過以下字符串輸入另一個命令:

| xargs -I '{}' 

因爲這會使您成爲一個非常強大的命令行用戶。

編輯:

如果你只是想改變所有的標籤1至TAG2,在這裏你去:

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

對於我從您的評論中瞭解的內容,您的答案在tag1和tag2之間切換。我想要的只是將'tag1'從'lines_to_change.txt'中的行更改爲'tag2'。如果你會考慮編輯你的答案。 – nunos 2013-03-06 01:55:16

+0

將修改後的行tag1更改爲tag2。 – HodorTheCoder 2013-03-06 19:06:00

0
awk 'NR==FNR { a[$0]; next } 
    $1 in a{ $2 = "tag2" } 1' FS=\| OFS=\| lines_to_change.txt input.txt