0

我想我可以编写一个小 Python 脚本来执行此操作,但我正在尝试学习如何仅使用 shell 来执行此类操作,因为我认为它更有意义。

基本上我有这样的事情:

数据库.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文件中的每一行,将该行的标记从更改tag1tag2. 有人告诉我这是命令行的工作sed,但在 man 文档中找不到我的方式。

谢谢。

4

4 回答 4

1

尝试这个

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

结果将保存到database.txt自身中

于 2013-03-05T18:26:28.027 回答
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

我恳请您记住的一件事是能够通过以下字符串将一个命令的输出传递到另一个命令的输入:

| xargs -I '{}'

因为这将使您成为一个非常强大的命令行用户。

编辑:

如果您只是想将所有 tag1 更改为 tag2,请执行以下操作:

cat file2.txt | xargs -I '{}' sed -i 's/{}|tag1/{}|tag2/gp' file1.txt
于 2013-03-05T19:16:15.150 回答
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 回答
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 回答