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