gpt4 book ai didi

linux - 使用 sed 将每列替换为不同的间距

转载 作者:太空宇宙 更新时间:2023-11-04 05:41:10 24 4
gpt4 key购买 nike

我正在尝试为输入文件的每一列替换不同的模式。

输入文件

this- START
this- START

我想要的结果

/this/ -START-
/this/ -START-

我的代码

sed 's|^\([a-zA-Z]*\)-\s\([a-zA-Z]*\)$|/\1/ -\2-|' inputfile

输出

/this/ -START-
this- START

第一个输入有效,但带有大量空格的第二个输入无效。我如何使用同一行代码来处理它们?

最佳答案

sed 使用 POSIX 基本正则表达式,顾名思义,它非常基本,没有很多您可能更习惯的其他 RE 软件包的语法糖或功能。但他们仍然可以处理这个问题:

$ cat input.txt
this- START
this- START
$ sed 's!^\([a-zA-Z]*\)-[[:space:]]\{1,\}\([a-zA-Z]*\)$!/\1/ -\2-!' input.txt
/this/ -START-
/this/ -START-

这里的关键在于 [[:space:]]\{1,\} 部分:[]字符类中的 [:space:] 匹配任何空白字符,如其他 RE 实现中的 \s ,而 \{1,\} 匹配 1 个或多个前面的原子,如几乎所有其他风格中的 + (也支持此)符号,尽管不需要反斜杠)。因此组合起来它匹配 1 个或多个空白字符。而且由于正则表达式是贪婪的,它会匹配最长的空白字符序列,而不是只看到一个就停止。

如果列之间只有空格,而不是空格和/或制表符,则可以将其简化为 \{1,\} (请注意前导文字空格;它在渲染的 Markdown 中并不明显)。您可以使用 [[:alpha:]] 而不是 [a-zA-Z] 来匹配所有字母字符。如果匹配非英语文本,则会有所不同。并且您可能需要使用 \{1,\} 而不是 * 来避免匹配 0 长度/缺失列(如果它们出现在您的输入中)。

关于linux - 使用 sed 将每列替换为不同的间距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57537604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com