我有这样的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
运行sed
tee
可选:如果要将输出写入sed
文件,只需附加> /path/to/file
到覆盖或>> /path/to/file
附加。