使用多个输入流时 GNU-Parallel 中的字符串替换

问题描述 投票:0回答:1

我知道如何在

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}"

谢谢,伊多

regex bash gnu-parallel
1个回答
0
投票

与此问题类似,是否可以使用预定义的替换字符串作为替换的输入,或者我是否需要从原始输入创建完整替换?

您需要根据原始输入创建完整替换。您可以在

man parallel
下的
--rpl
中找到定义:

--rpl '{/} s:.*/::'

所以:

... | parallel --rpl '{mybasename} s:.*/::; s:_non-important.txt::' echo {mybasename}

记住

--rpl
定义可以放在
~/.parallel/config

© www.soinside.com 2019 - 2024. All rights reserved.