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.