Вход:
random abcD .and$ 5487>1.2.3.4:random fghij & 9101112
выход:
1.2.3.4
Что я сделал до сих пор:
sed -e 's/'>'\(.*\)':'/\1/'
Я тоже пробовал:
sed -e 's/>\(.*\):/\1/'
Примечание: Я могу сделать это с помощью awk:
awk 'BEGIN { FS = ">" } ; { print $2 }' | awk 'BEGIN { FS = ":" } ; { print $1 }'
но это немного тяжеловато, не так ли?





Решение 1-е: Этот простой sed может вам в этом помочь.
sed 's/.*>//;s/:.*//' Input_file
Решение 2-е: Также добавляется решение awk.
awk '{gsub(/.*>|:.*/,"")} 1' Input_file
Решение 3-е: Использование другого awk с логикой разделителя полей.
awk -F'[>:]' '{print $2}' Input_file
Решение 4-е: Использование другого sed с логикой обратных ссылок.
sed 's/\(.*>\)\([^:]*\)\(.*\)/\2/' Input_file
если в строке есть другие символы ":" и ">", и вы уверены, что соответствующая подстрока содержит только "." и digitis [от 0 до 9], лучше использовать:
sed "s/.*>\([0-9|.][0-9|.]*\):.*/\1/g"
или лучше :
sed "s/.*>\([0-9|.]\+\):.*/\1/g"
или (чтобы соответствовать первому вхождению):
sed "s/.*>\([0-9|.]\+\):.*/\1/"
вы также можете использовать:
grep -o ">[0-9|.]*:" | grep -o "[0-9|.]*"
контрольная работа :
echo "random > abcD .and$ 5487>1.2.3.4:random : fghij > & 9101112" | sed "s/.*>\([0-9|.][0-9|.]*\):.*/\1/g"
1.2.3.4
echo "random > abcD .and$ 5487>1.2.3.4:random : fghij > & 9101112" | sed "s/.*>\([0-9|.]\+\):.*/\1/"
1.2.3.4