Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
删除所有,直到在bash中找到大写字母_Bash_Sed - Fatal编程技术网

删除所有,直到在bash中找到大写字母

删除所有,直到在bash中找到大写字母,bash,sed,Bash,Sed,我有一个输出 timeout.o: U alarm 000000000000t000 T catch_sig_alarm 0000000000000b13 T set_timeout U signal 0000000g00000000 B timeout 我需要去掉T、U和B之前的数字和字母,所以输出如下: timeout.o: U alarm T catch_sig_alarm T set_timeout U signal

我有一个输出

timeout.o:
                 U alarm
000000000000t000 T catch_sig_alarm
0000000000000b13 T set_timeout
                 U signal
0000000g00000000 B timeout
我需要去掉T、U和B之前的数字和字母,所以输出如下:

timeout.o:
U alarm
T catch_sig_alarm
T set_timeout
U signal
B timeout
如何使用sed实现这一点?我试过sed的/[0-9]*/;s/*/'但我也不知道如何说删除这些字母。

Update 根据实际输入数据,我认为timeout.o是文件名:

... | awk 'NF>1 {sub("^[^A-Z]*","")} {print}'
timeout.o:
U alarm
T catch_sig_alarm
T set_timeout
U signal
B timeout
它只在该行包含多个字段的情况下进行替换。这样,将跳过第一行。在这种情况下,NR>1也是一样的

您可以使用以下选项:

$ sed 's/^[^A-Z]*//' timeout.o
U alarm
T catch_sig_alarm
T set_timeout
U signal
B timeout
它所做的是从行首提取所有字符。^表示行首不是大写字母[^a-Z]*表示,并用空字符串替换它们

请注意,sed's/hello/bye/'将一次hello替换为bye。如果你不想做多重替换,你可以做sed's/hello/bye/g

如果要执行就地替换,请执行sed-i…

Update 根据实际输入数据,我认为timeout.o是文件名:

... | awk 'NF>1 {sub("^[^A-Z]*","")} {print}'
timeout.o:
U alarm
T catch_sig_alarm
T set_timeout
U signal
B timeout
它只在该行包含多个字段的情况下进行替换。这样,将跳过第一行。在这种情况下,NR>1也是一样的

您可以使用以下选项:

$ sed 's/^[^A-Z]*//' timeout.o
U alarm
T catch_sig_alarm
T set_timeout
U signal
B timeout
它所做的是从行首提取所有字符。^表示行首不是大写字母[^a-Z]*表示,并用空字符串替换它们

请注意,sed's/hello/bye/'将一次hello替换为bye。如果你不想做多重替换,你可以做sed's/hello/bye/g

如果您想进行就地替换,请执行sed-i

说明:[^A-Z]不是大写字母。第一个肯定的是,表达式开始于行开头,在中间行不流氓。表达式只是开始删除一行中的所有内容,直到找到大写字母

第一部分/^[a-zA-Z0-9]\+\.[a-z]\+:$/!直到s将移除限制到所有行为止,这不会影响最终结果!完全匹配[字母]…[点][字母]…[冒号],这看起来像一个文件名产品

说明:[^A-Z]不是大写字母。第一个肯定的是,表达式开始于行开头,在中间行不流氓。表达式只是开始删除一行中的所有内容,直到找到大写字母


第一部分/^[a-zA-Z0-9]\+\.[a-z]\+:$/!直到s将移除限制到所有行为止,这不会影响最终结果!精确匹配[字母]…[一个点][字母]…[一个冒号],这看起来像是一个文件名产品。

鉴于第一列似乎有固定的宽度,我只使用

{ read; echo "$REPLY"; cut -c18-; } < timeout.o

要删除前17个字符,同时保留完整的初始行。

鉴于第一列似乎有固定的宽度,我只需要使用

{ read; echo "$REPLY"; cut -c18-; } < timeout.o
cat timeout.o | sed 's/^[^BUT]* //'
删除前17个字符,同时完整保留起始行

cat timeout.o | sed 's/^[^BUT]* //'


sed的/^[^A-Z]*/'的问题是,它甚至删除了子替换后所需的timeout.o。我知道这个问题的标题不好,可悲的是,我现在意识到timeout.o没有大写字母。嘿,对不起,我的版本不正确。timeout.o是输入的一部分。请看问题的当前版本。好的。你可以使用@fedorqui的答案,但我也会尝试制作一个纯sed解决方案。你做了这样一个正则表达式!注意@djjolem的答案在[0-9a-z]*后面加了一个空格。谢谢,但是空格被[^a-z]覆盖,如果在大写字母之前,也将被删除。另一个用于文件名检测。sed的/^[^A-Z]*/'的问题是,它甚至删除了子替换后所需的timeout.o。我知道这个问题的标题不好,可悲的是,我现在意识到timeout.o没有大写字母。嘿,对不起,我的版本不正确。timeout.o是输入的一部分。请看问题的当前版本。好的。你可以使用@fedorqui的答案,但我也会尝试制作一个纯sed解决方案。你做了这样一个正则表达式!注意@djjolem的答案在[0-9a-z]*后面加了一个空格。谢谢,但是空格被[^a-z]覆盖,如果在大写字母之前,也将被删除。另一个用于文件名检测。sed的/^[^A-Z]*/'的问题是,它甚至删除了子替换后所需的timeout.o。我知道这个问题的标题不好,可悲的是,我现在意识到timeout.o没有大写字母哦,那么timeout.o也在你的输出中?如果是这样的话,那是我的错,因为我在编辑你的问题时认为它是文件名。它是:它取决于函数名,所以它可以是任何东西。o awk解决方案很好。比我的纯sed更简洁易懂。sed的/^[^A-Z]*/'的问题是,它甚至删除了替换后需要的timeout.o。我知道这个问题的标题不好,可悲的是我现在意识到它超时了。
o没有大写字母哦,那么timeout.o也在你的输出中?如果是这样的话,那是我的错,因为我在编辑你的问题时认为它是文件名。它是:它取决于函数名,所以它可以是任何东西。o awk解决方案很好。比我的纯sed one.thx答案更简洁易懂,问题现在被编辑,因此很明显超时。o不是一个文件,而是stringthx答案的一部分。问题现在被编辑,因此很明显超时。o不是一个文件,而是stringHey抱歉,我做了不正确的编辑。timeout.o是输入的一部分。看看问题的当前版本。哦,这是一个好方法!这样第一行就不匹配了,我很喜欢。另外请注意,cat timeout.o|sed的/^[^BUT]*/'可以写成sed的/^[^BUT]*/'timeout.o。嘿,很抱歉,我的版本不正确。timeout.o是输入的一部分。看看问题的当前版本。哦,这是一个好方法!这样第一行就不匹配了,我很喜欢。另外请注意,cat timeout.o|sed的/^[^BUT]*/'可以写成sed的/^[^BUT]*/'timeout.o。