如何使用 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
解释:使用awk
的match
函数,匹配从:
到直到这里第一次出现 |
。所以 match
函数所做的是,只要其中匹配了一个正则表达式,它就会为其名为 RSTART
和 RLENGTH
的 OOTB 变量设置值,因此基于此我们正在打印 sub-string 忽略匹配的部分,并根据相关的要求输出打印其他所有内容。
第二个解决方案: 在 GNU awk
中使用 FPAT
选项,尝试跟随,编写并测试仅显示您的示例。
awk -v FPAT=':[^|]*' '{print ,}' Input_file
我想删除“:”和第一个“|”之间的字符串使用 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
解释:使用awk
的match
函数,匹配从:
到直到这里第一次出现 |
。所以 match
函数所做的是,只要其中匹配了一个正则表达式,它就会为其名为 RSTART
和 RLENGTH
的 OOTB 变量设置值,因此基于此我们正在打印 sub-string 忽略匹配的部分,并根据相关的要求输出打印其他所有内容。
第二个解决方案: 在 GNU awk
中使用 FPAT
选项,尝试跟随,编写并测试仅显示您的示例。
awk -v FPAT=':[^|]*' '{print ,}' Input_file