如何同时cat和sed?

如何同时cat和sed?

我有这样的cat操作sed

cat ${location_x}/file_1 > ${location_y}/file2
sed -i "s/0/1/g" /${location_y}/file2

这可以在一行中完成吗?

我可能会想念这样的方式这里,但在我看来,这种解释似乎是在处理与此相反的问题,并且我也无法将上述内容统一到一个没有双与号()或分号( )的操作中cat,并且越来越接近假设这是不可能的,但这对我来说很重要在这里问,因为我可能是错的。sed&&;

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

答案1

是的:

sed 's/0/1/g' "$location_x/file_1" >"$location_y/file2"

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

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

sed -e 's/0/1/g' -- "$location_x/file_1" >"$location_y/file2"

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

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

tr '0' '1' <"$location_x/file_1" >"$location_y/file2"

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


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

答案2

tee仅使用不同方法的替代解决方案:

cat "${location_x}/file1" |\
  tee "${location_y}/file2" |\
  sed -i "s/0/1/g"

执行以下操作:

- cat:读取${location_x}/file1并将其传送到tee

- tee:将输入写入到cat${location_y}/file2通过管道传输到sed

- :在输入上sed运行sedtee

可选:如果要将输出写入sed文件,只需附加> /path/to/file到覆盖或>> /path/to/file附加。

相关内容