使用多输入流时GNU Parallel中的字符串替换问题
GNU Parallel 特定输入流替换与预定义替换串复用技巧
1. 仅对多输入流中的特定输入应用自定义替换
在多输入流场景下(比如用:::+分隔的多个输入集合),不想让--rpl定义的替换规则全局作用于所有输入流时,只需将自定义替换规则与指定的输入占位符绑定即可。
比如你原本的基础命令:
parallel echo "First name: {1}, Last name: {2}" ::: John Jane :::+ Doe Smith
若要仅对第2个输入流(姓氏)应用自定义替换,直接在{2}后附加替换规则,或通过--rpl定义规则后指定仅第2个流使用即可:
示例:定义一个文本转大写的替换规则,仅作用于姓氏:
parallel --rpl '{uc s/(.*)/\U$1/}' echo "First name: {1}, Last name: {2 uc}" ::: John Jane :::+ Doe Smith
输出结果:
First name: John, Last name: DOE First name: Jane, Last name: SMITH
这种{N 替换规则名}的写法,能精准指定替换仅作用于第N个输入流,不会影响其他流的内容。
2. 基于预定义替换串(如{/})做自定义替换
完全可以基于GNU Parallel的预定义替换结果(比如{/}提取文件名、{.}提取无后缀文件名等)做二次替换,有两种实现方式:
方式一:直接嵌套替换规则
无需单独定义--rpl,直接在预定义占位符后附加Perl替换规则:
ls -1 /home/user/*_non-important.txt | parallel echo "{/ s:_non-important.txt::}"
这条命令会先通过{/}提取文件名(去掉路径),再去掉_non-important.txt后缀,输出仅保留核心文件名。
方式二:通过--rpl复用自定义规则
如果需要重复使用该替换规则,可以用--rpl定义,在规则中先引用预定义替换的结果:
ls -1 /home/user/*_non-important.txt | parallel --rpl '{mybasename} $_=q{/}; s:_non-important.txt::' echo "{mybasename}"
其中$_=q{/}会先将当前输入转换为{/}的处理结果,再执行后续的替换操作,最终实现和嵌套写法一致的效果。
内容的提问来源于stack exchange,提问作者IsoBar
相关产品推荐
相关产品推荐

