Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell sed命令更改行的一部分_Shell - Fatal编程技术网

Shell sed命令更改行的一部分

Shell sed命令更改行的一部分,shell,Shell,我想我可以编写一个小python脚本来实现这一点,但我正在尝试学习如何仅使用shell来完成这类工作,因为我认为它更有意义 基本上我有这样的东西: database.txt: line1|tag1 line2|tag1 line3|tag2 line4|tag1 第\u至\u change.txt行: line1 line4 what_i_want.txt: line1|tag2 line2|tag1 line3|tag2 line4|tag2 因此,基本上,我想要的是,对于lines\u

我想我可以编写一个小python脚本来实现这一点,但我正在尝试学习如何仅使用shell来完成这类工作,因为我认为它更有意义

基本上我有这样的东西:

database.txt:

line1|tag1
line2|tag1
line3|tag2
line4|tag1
第\u至\u change.txt行:

line1
line4
what_i_want.txt:

line1|tag2
line2|tag1
line3|tag2
line4|tag2
因此,基本上,我想要的是,对于
lines\u to_change.txt
文件中的每一行,将该行的标记从
tag1
更改为
tag2
。我被告知这是命令行
sed
的工作,但在man文档中找不到我的方法

谢谢。

试试这个

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

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

首先在您的行上使用sed\u 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

这里有一个在tag1和tag2之间切换的解决方案

(因此,如果它是tag1,它会将其更改为tag2,如果它是tag2,它会将其更改为tag1。)它围绕着一个中间标记“tag3”(不管您如何称呼它),但它允许您在不知道现有标记状态的情况下进行切换。file2.txt有您的令牌,file1.txt是您的数据库文件(使用-i命令添加):

我恳请您将一个命令的输出通过以下字符串传递到另一个命令的输入,这是一个功能:

| xargs -I '{}'
因为这将使您成为一个非常强大的命令行用户

编辑:

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

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

请注意,
-i
被GNU
xargs
弃用,BSD版本不支持。改为使用
-I'{}'
。根据我从您的评论中理解的内容,您的答案在tag1和tag2之间切换。我想要的只是将所有
tag1
更改为
tag2
,从
lines\u更改为\u change.txt
。如果你会考虑编辑你的答案。
cat file2.txt | xargs -I '{}' sed -i 's/{}|tag1/{}|tag2/gp' file1.txt
awk 'NR==FNR { a[$0]; next } 
    $1 in a{ $2 = "tag2" } 1' FS=\| OFS=\| lines_to_change.txt input.txt