我有一个输出
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/ *//'
这样的东西,但我也不知道如何删除这些字母。
答案 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个字符(同时保留完整的初始行)。