我如何通过管道连接到 sed?

我如何通过管道连接到 sed?

我想从一个文件中打印一行,并将其用作另一个文件中的行替换的输入。

sed -n '12p' FILE1 | sed -i '12c\ STDIN' FILE2

这可能吗?

答案1

我不知道 sed 的任何实现都支持从命令的标准输入读取c,但在 GNU sed 中,您可以使用r带有伪文件名的命令/dev/stdin,然后d删除原始行:

... | sed -i '12{
r /dev/stdin
d
}' FILE2

或者,更紧凑地使用-e链接表达式

... | sed -i -e '12{r /dev/stdin' -e 'd;}' FILE2

大括号将rd命令分组,以便它们都针对该地址执行12。您不能简单地使用,12{r /dev/stdin; d;}因为; d;}将被解析为 参数的一部分r

答案2

使用 GNUsed并同时创建备份文件。

sed -i.bak "12c$(sed -n '12p' file1)" file2

或者便携式选项

sed -i.bak "12s/.*/$(sed -n '12p' file1)/" file2

答案3

不,sed将管道数据解释为操作位置,而不是替换模式。如果您提供文件名,管道将被忽略。您将不得不使用命令替换:

sed "12c$(sed -n 12p FILE1)" FILE2

或者通过命名管道绕道:

mkfifo sedpipe
sed -n 12p FILE1 >sedpipe &
sed -i "12c$(cat sedpipe)" FILE2

相关内容