我正在使用zsh
shell。我试图使用sed
它来替换许多文件中的某些文本,并使用并行来加快进程。当我在一个文件上测试它并让命令输出转到时,stdout
我看到了预期的结果。当我尝试将该输出重定向到文件时,我得到了一个空文件。发生了什么事?这是一个使用单个虚构数据文件的简单示例,您可以剪切和粘贴以说明...
setopt interactivecomments
# In this trivial example it is obviously non-sensical
# to use parallel, but in reality I have many files...
# Some very simple input data...
paste <(printf "%s\n" `seq 1 4`) <(printf "%s\n" `seq 1 4`) > ./input.txt
# This looks like:
#1 1
#2 2
#3 3
#4 4
# Pass data file to parallel and use sed to substitute.
# e.g. want to replace line '3 3' with '3 33'
# Output goes to stdout & seems correct...
z=`find ./input.txt`
echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/"'
#1 1
#2 2
#3 33 ===> correct replacement
#4 4
# But redirecting to a file leads to empty file...
echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/" > {//}/result.txt'
# Empty file
cat ./result.txt
发生了什么?我是否指定了错误的内容?
我在用:
Ubuntu 12.04.4 LTS
GNU parallel 20130522
GNU sed version 4.2.1
zsh 4.3.17
答案1
在命令中使用重定向时parallel
,必须将{}
输入放在正确的位置,作为参数sed
:
echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/" {} > {//}/result.txt'
此外,如果{//}
使用了(或任何其他替换字符串),parallel
则不会自动将输入附加到命令末尾。(在这种情况下,这无论如何都是错误的,因为它会在重定向之后出现。)
本质上,问题中的代码运行
sed "s/(^3.*3\)/\13/" > ./result.txt
但它需要
sed "s/(^3.*3\)/\13/" ./input.txt > ./result.txt