2013-03-05 47 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