我想从一个文件中打印一行,并将其用作另一个文件中的行替换的输入。
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
大括号将r
和d
命令分组,以便它们都针对该地址执行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