Câu trả lời:
Điều này có thể được thực hiện với cut
:
cut -d _ -f 1
ví dụ
$ echo host100_044 2 | cut -d _ -f 1
host100
Ngoài ra với awk
có thể được thực hiện với awk -F_ '{print $1}'
(có thể có một cách sạch hơn để làm điều đó)
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} {printf("host%s ", $1)}' | cut -d ' ' -f2-
Đầu ra:
host100 host101 host102
Với dòng mới:
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} $1 ~ /[0-9]/ {print "host"$1}'
Đầu ra:
host100
host101
host102
Sử dụng sed
:
echo host100_044 2 | sed 's;_.*;;'
Sử dụng sed
tùy chọn chỉnh sửa tại chỗ,
sed -i.old 's;_.*;;' infile
awk
giải pháp đã được đăng (và cut
có lẽ là tốt nhất trong trường hợp này), vì anh ấy đã hỏi sed
, nhưng bạn đã đánh bại tôi trong vài giây :-). Bạn thậm chí có thể loại bỏ $
, vì nó sẽ khớp .*
với cuối dòng theo mặc định.
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100
Các -F'_'
hướng dẫn awk
sử dụng dấu gạch dưới làm dấu phân cách trường. Bản awk
thân kịch bản chỉ in trường đầu tiên.
Điều này sẽ in đầu ra trước _
:
sed 's/_.*//' -filename