使用 sed 与 parallel 结合使用时重定向到文件时输出为空

使用 sed 与 parallel 结合使用时重定向到文件时输出为空

我正在使用zshshell。我试图使用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

相关内容