如何使用 sed 删除两个字符之间和第一次出现之前的字符串

How to remove string between two characters and before the first occurrence using sed

我想删除“:”和第一个“|”之间的字符串使用 sed.

输入: |abc:1.2.3|def|

sed 的输出: |abc|def|

我想出了 sed 's|\(:\)[^|]*||',但是这个 sed 命令不会删除第一个字符(“:”)。我如何修改此命令以同时删除冒号?

您不需要在您的模式中分组 : 并在替换中使用它。

你应该保持简单:

s='|abc:1.2.3|def|'
sed 's/:[^|]*//' <<< "$s"

|abc|def|

: 匹配冒号,[^|]* 匹配 0 个或多个 non-pipe 个字符

第一个解决方案: 使用 awk 你可以尝试遵循 awk 程序。

awk 'match([=10=],/:[^|]*/){print substr([=10=],1,RSTART-1) substr([=10=],RSTART+RLENGTH)}' Input_file

解释:使用awkmatch函数,匹配从:到直到这里第一次出现 |。所以 match 函数所做的是,只要其中匹配了一个正则表达式,它就会为其名为 RSTARTRLENGTH 的 OOTB 变量设置值,因此基于此我们正在打印 sub-string 忽略匹配的部分,并根据相关的要求输出打印其他所有内容。



第二个解决方案: 在 GNU awk 中使用 FPAT 选项,尝试跟随,编写并测试仅显示您的示例。

awk -v FPAT=':[^|]*' '{print ,}'  Input_file