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

时间:2014-03-26 15:42:49

标签: 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
B timeout

我怎么能用sed做到这一点?我试过像sed 's/[0-9]*//;s/ *//'这样的东西,但我也不知道如何删除这些字母。

4 个答案:

答案 0 :(得分:3)

更新

基于真实的输入数据(我认为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]*表示)并用空字符串替换它们。 / p>

请注意,sed 's/hello/bye/'表达式会将hello替换为bye。如果您想进行多次替换(不是这种情况),您可以执行sed 's/hello/bye/g'

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

答案 1 :(得分:2)

input | sed '/^[a-zA-Z0-9.]\+\.[a-z]\+:$/!s/^[^A-Z]*//'

说明:[^A-Z]不是大写字母的所有内容。第一个^确保表达式从行开始处开始,并且不会在行的中间变为流氓。表达式只是开始删除一行中的所有内容,直到找到一个大写字母。

第一部分/^[a-zA-Z0-9]\+\.[a-z]\+:$/!直到s限制删除所有行,而不是(最终!)完全匹配[letter]...[a dot][letter]...[a colon],这看起来像一个文件名生成。

答案 2 :(得分:1)

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

sed 's/[0-9a-z]* //;s/ *//'

答案 3 :(得分:0)

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

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

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