bash sed обрабатывает данные с конца строки или что-то еще

У меня есть два типа выходов:

UID:474D229F698D494E889D85CEF9303B97:480 f
UID:474D229F698D494E889D85CEF9303B97:480

Я хочу получить 32-символьную длинную UID с 480-ой в конце. (Обратите внимание, что после 480 нет ничего для второго типа ввода) Желаемый вывод:

474D229F698D494E889D85CEF9303B97:480
474D229F698D494E889D85CEF9303B97:480

Я использую sed:

cat input.txt | sed 's!UID:\(.*\):\([0-9]*\)[\s]*!Captured:\1:\2!'

но вывод:

Captured:474D229F698D494E889D85CEF9303B97:480 f
Captured:474D229F698D494E889D85CEF9303B97:480

3 ответа

Решение

awk в помощь?

$ awk -F"[: ]" '{print $2":"$3}' file
474D229F698D494E889D85CEF9303B97:480
474D229F698D494E889D85CEF9303B97:480

Пояснение: мы определяем различные возможные разделители полей : или пространство , Когда текст разделен, мы печатаем 2-е и 3-е поля.

sed путь может быть следующим:

$ sed 's/UID:\([^:]*\):\([^ ]*\).*/Captured:\1:\2/g' file
Captured:474D229F698D494E889D85CEF9303B97:480
Captured:474D229F698D494E889D85CEF9303B97:480

Пояснение: мы видим, что текст основан на шаблоне UID:number:number something, Следовательно, мы получаем это с UID:\([^:]*\):\([^ ]*\).*, С \( expression \) мы фиксируем нужный нам текст, чтобы его можно было напечатать позже \1, \2...

Это нормально?

grep -oE '[^:]{32}:[^: ]*' file

например:

kent$  echo "UID:474D229F698D494E889D85CEF9303B97:480 f
UID:474D229F698D494E889D85CEF9303B97:480"|grep -oE '[^:]{32}:[^: ]*'
474D229F698D494E889D85CEF9303B97:480
474D229F698D494E889D85CEF9303B97:480

та же идея с sed:

sed -r 's/.*([^:]{32}:[^: ]*).*/\1/' file

В bash вы можете использовать расширение параметра:

s=${s% *}    # Remove everything after space.
echo ${s#*:} # Remove everything before colon.
Другие вопросы по тегам