【发布时间】:2022-02-03 17:13:35
【问题描述】:
我想删除“:”和第一个“|”之间的字符串使用 sed。
输入:
|abc:1.2.3|def|
sed 的输出:
|abc|def|
我设法想出了 sed 's|\(:\)[^|]*|\1|',但是这个 sed 命令不会删除第一个字符(“:”)。如何修改此命令以同时删除冒号?
【问题讨论】:
我想删除“:”和第一个“|”之间的字符串使用 sed。
输入:
|abc:1.2.3|def|
sed 的输出:
|abc|def|
我设法想出了 sed 's|\(:\)[^|]*|\1|',但是这个 sed 命令不会删除第一个字符(“:”)。如何修改此命令以同时删除冒号?
【问题讨论】:
您不需要在您的模式中将: 分组并使用它来替代。
你应该保持简单:
s='|abc:1.2.3|def|'
sed 's/:[^|]*//' <<< "$s"
|abc|def|
: 匹配冒号,[^|]* 匹配 0 个或多个非管道字符
【讨论】:
第一种解决方案:使用awk,您可以尝试关注awk 程序。
awk 'match($0,/:[^|]*/){print substr($0,1,RSTART-1) substr($0,RSTART+RLENGTH)}' Input_file
解释: 使用awk 的match 函数,这里从: 匹配到直到第一次出现|。所以match 函数所做的是,每当其中匹配一个正则表达式时,它将为其名为RSTART 和RLENGTH 的OOTB 变量设置值,因此基于此我们打印子字符串以忽略匹配的部分并打印其他一切都根据所要求的输出。
第二个解决方案:在 GNU awk 中使用 FPAT 选项,尝试仅使用您显示的示例进行跟踪、编写和测试。
awk -v FPAT=':[^|]*' '{print $1,$2}' Input_file
【讨论】: