如何将 cat 和 sed 放在一起?

use*_*970 9 sed io-redirection cat

我有这个cat然后sed操作:

cat ${location_x}/file_1 > ${location_y}/file2
sed -i "s/0/1/g" /${location_y}/file2
Run Code Online (Sandbox Code Playgroud)

这可以在一行中完成吗?

我可能会错过这样的方式在这里,但这个解释在我看来,解决的是相反的,我不能太团结以上cat,并sed为一个操作,而双号(&&)或分号(;),并越来越接近假设它是不可能的,但在这里问对我来说很重要,因为我可能是错的。

并非所有讲英语的读者都熟悉术语“&符号”或“分号”,因此我详细说明了这些。

Kus*_*nda 22

是的:

sed 's/0/1/g' "$location_x/file_1" >"$location_y/file2"
Run Code Online (Sandbox Code Playgroud)

您的代码首先复制第一个文件,然后使用sed -i. 上面的代码从原始文件中读取,进行更改,并将结果写入新文件。这里没有必要cat

如果您使用的是 GNUsed并且$location_x可能包含前导-,则需要确保路径不被解释为命令行标志:

sed -e 's/0/1/g' -- "$location_x/file_1" >"$location_y/file2"
Run Code Online (Sandbox Code Playgroud)

双破折号标志着命令行选项的结束。另一种方法是使用<将文件内容重定向到sed. 其他sed实现 (BSD sed) 在第一个非选项参数处停止解析命令行选项,而 GNU sed(像其他一些 GNU 软件一样)在解析命令行时重新排列命令行。

对于此特定编辑操作(将所有零更改为 1),以下操作也将起作用:

tr '0' '1' <"$location_x/file_1" >"$location_y/file2"
Run Code Online (Sandbox Code Playgroud)

请注意,tr始终从标准输入读取,因此<从原始文件重定向输入。


我注意到在您的sed命令行上,您尝试访问/${location_y}/file2,这与其上方行上的路径(/路径开头)不同。这可能是一个错字。