Пожалуйста, рассмотрите этот фрагмент:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* //p')
Я хочу поместить последнее слово в переменную, если какое-либо условие шаблона соответствует строкам в произвольном текстовом файле.
Моя проблема в том, что переменная X
имеет CR или LF или CRLF в конце, в зависимости от исходного файла, от которого я хочу избавиться, поскольку это мешает дальнейшей работе, которую я собираюсь сделать.
Я даже попробовал что-то вроде:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* \([A-Za-z]\+\)/\1/p')
таким образом ожидая, что sed
вывод будет ограничен, [A-Za-z]+
но все еще есть эти байты неприятности внутри переменной X.
Как я могу избавиться от этого, не используя слишком много кода, например, посмотреть, какие байты находятся в конце, xxd
затем cut
он и подобные сложности?
X
CR
, но будетLF
. Мне было трудно понять, что вы хотите от вопроса, надеюсь, моя редакция делает то, что вы хотите.grep/sed
вместо этого кто-нибудь обратится к этому решениюawk
(что я не понимаю), и если нет, то я его использую. СпасибоСимвол
``
или$()
удалит символ новой строки с конца, но для этого используйте программуtr
.Это удалит возврат каретки и / или перевод строки из строки.
Проблема может заключаться в том, как вы выводите результат. Например, по умолчанию
echo
добавляется новая строка. Вы можете использоватьecho -n
илиprintf
.источник
-m1
Гарантирует , что существует только один линейный выход, который , по всей вероятности, будет иметь возврат каретки в конце.tr
... интересно, работает как на LF, так и на CRLF файлах. Я бы подумал\010\013
почему-то и тоже\f\r
работает правильно. О результате: я не помещаю вывод в переменную, а как переменную, заключенную$()
в шаблон дляgrep
соответствия -some pipe | grep -o " $(...) "
. Спасибо за комментарииЯ предпочитаю этот путь
источник
Это работает для меня:
источник
Почему бы просто не
sed
сделать[\r\f]
уборкуВаш второй подход не хватает окончательного регулярное выражение , чтобы поймать заднюю CR,
\r
.источник
Обычная версия grep (включая grep -P) всегда выводит перевод строки со своим соответствием, поэтому, если у вас есть только один результат (или вы хотите удалить только последний добавленный перевод строки), достаточно просто удалить последний символ выход, который вы можете сделать, пропустив его через
head -c-1
.источник