我知道如何在
parallel
中执行 perl 风格的字符串替换,并且我喜欢它,但我想知道当我有 2 个输入流时是否可以使用它并仅对特定输入应用替换。
例如,假设我运行以下命令:
$ parallel echo "First name: {1}, Last name: {2}" ::: John Jane :::+ Doe Smith
输出是:
First name: John, Last name: Doe
First name: Jane, Last name: Smith
假设我只想用替换字符串初始化姓氏:
$ parallel --rpl "{init} s:(\w).+:\1:" echo "First name: {1}, Last name: {init}" ::: John Jane :::+ Doe Smith
parallel
实际上将替换两个输入流以生成以下输出:
First name: John, Last name: J D
First name: Jane, Last name: J S
(注意姓氏中额外的J)。
有什么方法可以告诉
parallel
我想对哪个输入进行操作吗?
更新
回答我的问题时,我顿悟了(或回想起),我尝试在调用替换字符串时在大括号内添加所需输入的数量,它完全符合我的要求:
$ parallel --rpl "{init} s:(\w).+:\1:" echo "First name: {1}, Last name initial: {2 init}" ::: John Jane :::+ Doe Smith
First name: John, Last name: D
First name: Jane, Last name: S
与此问题类似,是否可以使用预定义的替换字符串作为替换的输入,或者我是否需要从原始输入创建完整替换?
例如,我可以以某种方式使用替换字符串
{/}
来删除路径,然后在没有路径的情况下对基本文件名进行替换:
ls -1 /home/user/*_non-important.txt | parallel --rpl "{mybasename} s:_non-important.txt::" echo "{mybasename}"
谢谢,伊多
与此问题类似,是否可以使用预定义的替换字符串作为替换的输入,或者我是否需要从原始输入创建完整替换?
您需要根据原始输入创建完整替换。您可以在
man parallel
下的--rpl
中找到定义:
--rpl '{/} s:.*/::'
所以:
... | parallel --rpl '{mybasename} s:.*/::; s:_non-important.txt::' echo {mybasename}
记住
--rpl
定义可以放在~/.parallel/config
中