3 个不稳定版本
0.3.0 | 2020年5月6日 |
---|---|
0.2.2 | 2018年10月24日 |
0.2.0 | 2018年4月9日 |
#1087 in 命令行工具
22KB
389 行
Rargs 是一种类似 xargs
+ awk
,具有模式匹配支持的工具。
安装
Mac OS
brew install rargs
二进制文件
在 发布页面 下载并将其解压到您的 PATH
中。
使用 Cargo
cargo install --git https://github.com/lotabout/rargs.git
示例用法
批量重命名文件
假设您有一些备份文件,其名称符合模式 <scriptname>.sh.bak
,并且您想将每个文件名映射回 <scriptname>.sh
。我们想批量操作,所以 xargs
是一个自然的选择,但我们如何指定每个文件的名字?我相信没有简单的方法。
然而,使用 rargs
,您可以这样做
ls *.bak | rargs -p '(.*)\.bak' mv {0} {1}
这里的 {0}
指的是整行输入,而 {1}
指的是正则表达式捕获的第一个组。
批量下载
我有一堆 URL 和它们对应的目标文件名存储在一个 CSV 文件中
URL1,filename1
URL2,filename2
我希望有一个简单的方法来下载并保存每个 URL 和其指定的文件名。使用 rargs
就有
cat download-list.csv | rargs -p '(?P<url>.*),(?P<filename>.*)' wget {url} -O {filename}
这里的 (?P<group_name>...)
将 group_name
的名字分配给捕获的组。这可以在命令中作为 {group_name}
引用。
AWK 替换?
假设您有一个具有许多列的 xSV 文件,并且您只想提取和格式化其中的一些列,例如。
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
以下是使用 rargs
处理它的示例
$ cat /etc/passwd | rargs -d: echo -e 'id: "{1}"\t name: "{5}"\t rest: "{6..::}"'
id: "nobody" name: "Unprivileged User" rest: "/var/empty:/usr/bin/false"
id: "root" name: "System Administrator" rest: "/var/root:/bin/sh"
id: "daemon" name: "System Services" rest: "/var/root:/usr/bin/false"
rargs
允许您指定分隔符(正则表达式)以在输入上分割,并允许您引用相应的字段或字段范围。这使得它可以作为某些简单但常见的 AWK 替代品使用。
它是如何工作的?
- 从标准输入接收输入并将其拆分为行
- 通过(
-d
)或提取(-p
)输入到命名或编号的组中,其中{0}
匹配整个行 - 将命名和编号的组映射到作为剩余参数传递的命令中,并执行该命令
功能
正则表达式捕获
rargs
允许您使用任何正则表达式来匹配输入,并捕获您感兴趣的内容。语法是标准的,与 Perl 兼容性较好,由Rust 正则表达式语法使用,例如 ripgrep。
- 位置(编号)组通过括号捕获,例如
'(\w+):(\d+)'
,并且在命令中使用{1}
、{2}
等引用相应的组 - 命名组通过
(?P<name>...)
捕获,并在命令中使用{name}
引用
分隔符捕获
对于简单使用,您可能不想编写整个正则表达式来提取行的部分。您只想通过某些分隔符拆分组。使用 rargs
,您可以通过使用 -d
(分隔符)选项来实现这一点。
字段范围
我们已经知道如何通过数字({1}
)或名称({name}
)引用捕获。也有可能需要同时替换多个字段。 rargs
也支持使用字段范围表达式来实现这一点。
假设我们已经捕获了5组,分别表示字符串 1、2、3、4 和 5
{..}
将它们全部收集到1 2 3 4 5
(注意它们之间用空格分隔;这可以通过-s
选项来覆盖){..3}
结果为1 2 3
{4..}
的结果为4 5
{2..4}
的结果为2 3 4
{3..3}
的结果为3
您还可以指定一个“本地”分隔符(它不会影响全局设置)
{..3:-}
的结果为1-2-3
{..3:/}
的结果为1/2/3
负字段
有时您可能希望引用最后几个字段,但无法预测输入字段的总数。 rargs
提供负字段。
假设我们已经捕获了5组,分别表示字符串 1、2、3、4 和 5
{-1}
的结果为5
{-5}
的结果为1
{-6}
的结果为空{-3..}
的结果为3 4 5
多线程
您可以在多个线程中运行命令以提高性能
-w <num>
指定您想要同时运行的工人数-w 0
默认将工人数设置为系统上的 CPU 数量
特殊变量
{LINENUM}
或{LN}
用于引用当前行号。
感兴趣吗?
所有反馈和 PR 都受欢迎!
依赖项
约 4.5-6MB
~106K SLoC