小编pot*_*ong的帖子

非贪婪的模式表达

我一直在阅读Friedl的"掌握正则表达式",并试图为一个由单词分隔的字符串设计一个常见的非贪婪模式表达式.从基础开始,分隔词只是单个字符' a '表达式:

sed -r 's/([^a]*)(a)/\                                                                  
(1)\1(2)\2(ALL)&(END)/g' <<<"xaxxaxxxaxxx...aa..."

(1)x(2)a(ALL)xa(END)
(1)xx(2)a(ALL)xxa(END)
(1)xxx(2)a(ALL)xxxa(END)
(1)xxx...(2)a(ALL)xxx...a(END)
(1)(2)a(ALL)a(END)...
Run Code Online (Sandbox Code Playgroud)

模式(参考Friedl)可能是:

  • [ 正常*关闭 ]

继续使用真正的多字符" ab "分隔符:

sed -r 's/([^a]*)((a[^b]*)*)(ab)/\                          
(1)\1(2)\2(3)\3(4)\4(ALL)&(END)/g' <<<"xabxxabxxxabxxx...abxxx...aabxxx...axxx...aaabxaabaxabaxaxabxaxaabxxaaabaaxxab..."

(1)x(2)(3)(4)ab(ALL)xab(END)
(1)xx(2)(3)(4)ab(ALL)xxab(END)
(1)xxx(2)(3)(4)ab(ALL)xxxab(END)
(1)xxx...(2)(3)(4)ab(ALL)xxx...ab(END)
(1)xxx...(2)a(3)a(4)ab(ALL)xxx...aab(END)
(1)xxx...(2)axxx...aa(3)axxx...aa(4)ab(ALL)xxx...axxx...aaab(END)
(1)x(2)a(3)a(4)ab(ALL)xaab(END)
(1)(2)ax(3)ax(4)ab(ALL)axab(END)
(1)(2)axax(3)axax(4)ab(ALL)axaxab(END)
(1)x(2)axa(3)axa(4)ab(ALL)xaxaab(END)
(1)xx(2)aa(3)aa(4)ab(ALL)xxaaab(END)
(1)(2)aaxx(3)aaxx(4)ab(ALL)aaxxab(END)...
Run Code Online (Sandbox Code Playgroud)

模式可能是:

  • [ 正常*(特殊*)*结束 ]

对于后续的' abc '分隔符,特殊表达式可以扩展为:

(a[^b]*)*(ab[^c]*)*
Run Code Online (Sandbox Code Playgroud)
  1. 它是否正确?
  2. 可以证明吗?
  3. 可以简化特殊表达吗?
  4. 这有更好/更有效的表达方式吗?我不是用perl的非贪婪'*?' 操作员和避免交替.
  5. 我在哪里可以找到这类问题的参考资料(弗里德提到但没有公布解决方案).

regex sed

11
推荐指数
1
解决办法
704
查看次数

使用 nix-shell 或 nix shell 在 Linux 64 上运行 MacOS sed

在回答关于 SO 的 sed 问题时,我经常遇到“适用于 linux 但不适用于 MacOS”的问题,是否可以将在 MacOS 上运行的 sed 版本加载到 nix shell 中?

目前使用 flakes 我可以使用以下方法获取最新的 gnused:

nix shell nixpkgs#gnused
Run Code Online (Sandbox Code Playgroud)

有没有办法临时安装 BSD/MacOS 版本的 sed?

linux macos sed nixos nix

5
推荐指数
1
解决办法
656
查看次数

nix-shell '&lt;nixpkgs&gt;' -A gnused 的等效 shell.nix 是什么

我正在尝试探索 gnu sed 代码库。

我可以从命令行执行此操作:

nix-shell '<nixpkgs>' -A gnused
unpackPhase
cd sed-4.8
configurePhase
buildPhase
Run Code Online (Sandbox Code Playgroud)

然后在 sed 等下编辑代码

但是,我想使用未安装的 ctags:

nix-shell -p ctags
Run Code Online (Sandbox Code Playgroud)

安装软件包但是:

nix-shell '<nixpkgs>' -A gnused -p ctags
Run Code Online (Sandbox Code Playgroud)

得到错误:

error: attribute 'gnused' in selection path 'gnused' not found
Run Code Online (Sandbox Code Playgroud)

我意识到我必须使用 shell.nix 但我找不到上述的 mkShell 示例。

PS 两次调用 nix-shell 达到了所需的结果,但这似乎很笨拙:

nix-shell -p ctags
nix-shell '<nixpkgs>' -A gnused
Run Code Online (Sandbox Code Playgroud)

nix nix-shell

4
推荐指数
1
解决办法
912
查看次数

每三次出现一个字符串

我有这样一个文件:

Sed eleifend orci eget odio
consequat. Sed sagittis ipsum
eget pulvinar. Sed ut lacus
Sed luctus sollicitudin ligula
varius neque. Sed tincidunt
Sed mauris egestas eget. Sed
Curae; Sed aliquam enim Sed,
Sed dictum quis sem. Sed
volutpat tincidunt. Sed lacus.
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

Sed eleifend orci eget odio
consequat. Sed sagittis ipsum
eget pulvinar. Sed Sed ut lacus
Sed luctus sollicitudin ligula
varius neque. Sed tincidunt
Sed Sed mauris egestas eget. Sed
Curae; Sed aliquam enim Sed Sed,
Sed dictum …
Run Code Online (Sandbox Code Playgroud)

bash perl awk command-line sed

3
推荐指数
1
解决办法
227
查看次数

计算文件中的10位数字的数量

我需要计算一个10位数字出现在文件中的实例总数.所有数字都有前导零,例如:

This is some text. 0000000001
Run Code Online (Sandbox Code Playgroud)

返回:

1
Run Code Online (Sandbox Code Playgroud)

如果相同的数字出现多次,则会再次计算,例如:

0000000001 This is some text.
0000000010 This is some more text.
0000000001 This is some other text.
Run Code Online (Sandbox Code Playgroud)

返回:

3
Run Code Online (Sandbox Code Playgroud)

有时在数字之间没有空格,但应计算每个连续的10位数字符串:

00000000010000000010000000000100000000010000000001
Run Code Online (Sandbox Code Playgroud)

返回:

5
Run Code Online (Sandbox Code Playgroud)

如何确定文件中出现的10位数字的总数?

bash grep

3
推荐指数
1
解决办法
3571
查看次数

标签 统计

sed ×3

bash ×2

nix ×2

awk ×1

command-line ×1

grep ×1

linux ×1

macos ×1

nix-shell ×1

nixos ×1

perl ×1

regex ×1