#regex #awk #xargs #cli

app rargs

xargs 和 awk 的模式匹配支持

3 个不稳定版本

0.3.0 2020年5月6日
0.2.2 2018年10月24日
0.2.0 2018年4月9日

#1087 in 命令行工具

MIT 许可证

22KB
389

Rargs 是一种类似 xargs + awk,具有模式匹配支持的工具。

Crates.io Build Status

安装

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 替代品使用。

它是如何工作的?

  1. 从标准输入接收输入并将其拆分为行
  2. 通过(-d)或提取(-p)输入到命名或编号的组中,其中 {0} 匹配整个行
  3. 将命名和编号的组映射到作为剩余参数传递的命令中,并执行该命令

功能

正则表达式捕获

rargs 允许您使用任何正则表达式来匹配输入,并捕获您感兴趣的内容。语法是标准的,与 Perl 兼容性较好,由Rust 正则表达式语法使用,例如 ripgrep

  • 位置(编号)组通过括号捕获,例如 '(\w+):(\d+)',并且在命令中使用 {1}{2} 等引用相应的组
  • 命名组通过 (?P<name>...) 捕获,并在命令中使用 {name} 引用

分隔符捕获

对于简单使用,您可能不想编写整个正则表达式来提取行的部分。您只想通过某些分隔符拆分组。使用 rargs,您可以通过使用 -d(分隔符)选项来实现这一点。

字段范围

我们已经知道如何通过数字({1})或名称({name})引用捕获。也有可能需要同时替换多个字段。 rargs 也支持使用字段范围表达式来实现这一点。

假设我们已经捕获了5组,分别表示字符串 12345

  • {..} 将它们全部收集到 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组,分别表示字符串 12345

  • {-1} 的结果为 5
  • {-5} 的结果为 1
  • {-6} 的结果为空
  • {-3..} 的结果为 3 4 5

多线程

您可以在多个线程中运行命令以提高性能

  • -w <num> 指定您想要同时运行的工人数
  • -w 0 默认将工人数设置为系统上的 CPU 数量

特殊变量

  • {LINENUM}{LN} 用于引用当前行号。

感兴趣吗?

所有反馈和 PR 都受欢迎!

依赖项

约 4.5-6MB
~106K SLoC