Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用awk从字符串中提取子字符串_Regex_String_Bash_Shell_Awk - Fatal编程技术网

Regex 使用awk从字符串中提取子字符串

Regex 使用awk从字符串中提取子字符串,regex,string,bash,shell,awk,Regex,String,Bash,Shell,Awk,我的字符串可以是以下两种格式之一: dts12931212112 : some random message1 : abc, xyz nodts : some random message2 我需要从这两个没有“dts”部分的字符串中提取子字符串,即它应该返回: some random message1 : abc, xyz some random message2 我需要在bash脚本中执行此操作 您能帮我使用awk命令吗?它对这两种字符串都执行此操作。通过awk的gsub函数 $ awk

我的字符串可以是以下两种格式之一:

dts12931212112 : some random message1 : abc, xyz
nodts : some random message2
我需要从这两个没有“dts”部分的字符串中提取子字符串,即它应该返回:

some random message1 : abc, xyz
some random message2
我需要在bash脚本中执行此操作


您能帮我使用awk命令吗?它对这两种字符串都执行此操作。

通过awk的gsub函数

$ awk '{gsub(/^[^:]*dts[^:]*:|:[^:]*dts[^:]*/, "")}1' file
 some random message1 : abc, xyz
 some random message2
$ awk '{gsub(/^[^:]*dts[^:]*:[[:blank:]]*|:[^:]*dts[^:]*/, "")}1' file
some random message1 : abc, xyz
some random message2
您也可以在sed中应用相同的正则表达式,但需要启用
-r
--regexp extended
参数

^
断言我们处于起点<代码>[^:::]*与任何字符(但不属于
)匹配的求反字符类,零次或多次。因此,这个
^[^::]*dts[^:::*:
将匹配开头包含
dts
的子字符串。如果子字符串位于中间,则不会接触。此
:[^::]*dts[^:::]*
模式与具有
dts
的中间或最后一个子字符串匹配。最后,用空字符串替换匹配的字符将得到所需的输出

更新:

$ awk '{gsub(/^[^[:space:]]*dts[^[:space:]]*[[:space:]:]*|[[:space:]:]*[^[:space:]]*dts[^[:space:]]*/, "")}1' file
some random message1 : abc, xyz
some random message2

这里是另一个
awk

awk -F" : " '{$1="";sub(FS,"")}1' OFS=" : " file
some random message1 : abc, xyz
some random message2
当第一个字段被


另一个版本:

awk -F" : " '{print substr($0,index($0,$2))}' file
some random message1 : abc, xyz
some random message2

从第二字段获取所有数据,并通过<代码>分隔出:

我忘了提及——在DTS号(冒号):“可能或可能不存在”之后,考虑任何空白作为分隔符。在这种情况下,这个命令不起作用。是的。谢谢顺便说一句,在awk中使用[:blank:]和[:space:]有什么区别吗?您可以使用
[:blank:]
而不是
[:space:]
,其中
blank
匹配任何水平空白字符(空白,制表符),
空格
同时匹配水平和垂直空白字符(空格、制表符、换行符、回车符)。