我一直在阅读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)
在回答关于 SO 的 sed 问题时,我经常遇到“适用于 linux 但不适用于 MacOS”的问题,是否可以将在 MacOS 上运行的 sed 版本加载到 nix shell 中?
目前使用 flakes 我可以使用以下方法获取最新的 gnused:
nix shell nixpkgs#gnused
Run Code Online (Sandbox Code Playgroud)
有没有办法临时安装 BSD/MacOS 版本的 sed?
我正在尝试探索 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) 我有这样一个文件:
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) 我需要计算一个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位数字的总数?