Как удалить последний символ из вывода bash grep - PullRequest
50 голосов
/ 22 февраля 2011
COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2` 

выводит что-то вроде этого

"Abc Inc";

Что я хочу сделать, так это удалить трейлинг ";"также.Как я могу это сделать?Я новичок в Bash.Любые мысли или предложения будут полезны.

Ответы [ 14 ]

58 голосов
/ 20 сентября 2011

При этом будет удален последний символ, содержащийся в вашей переменной COMPANY_NAME, независимо от того, является ли она точкой с запятой:

echo "$COMPANY_NAME" | rev | cut -c 2- | rev
46 голосов
/ 22 февраля 2011

Я бы использовал sed 's/;$//'. например:

COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | sed 's/;$//'`
42 голосов
/ 16 августа 2013
foo="hello world"
echo ${foo%?}
hello worl
21 голосов
/ 31 января 2014

Я бы использовал head --bytes -1 или head -c-1 для краткости.

COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | head --bytes -1`

head выводит только начало потока или файла. Как правило, он считает строки, но вместо этого он может быть сделан для подсчета символов / байтов. head --bytes 10 выведет первые десять символов, но head --bytes -10 выведет все, кроме последних десяти.

Примечание: у вас могут быть проблемы, если последний символ является многобайтовым, но точка с запятой не

Я бы порекомендовал это решение вместо sed или cut, потому что

  • Это именно то, для чего был разработан head, поэтому меньше параметров командной строки и более удобной для чтения команды
  • Это избавляет вас от необходимости думать о регулярных выражениях, которые крутые / мощные, но часто лишние
  • Это избавляет вашу машину от необходимости думать о регулярных выражениях, поэтому будет незаметно быстрее
10 голосов
/ 11 октября 2013

Я считаю, что самый простой способ вырезать отдельный символ из строки с помощью bash:

echo ${COMPANY_NAME:: -1}

, но я не смог встроить фрагмент grep в фигурные скобки, поэтому ваша конкретная задачастановится двухстрочным:

COMPANY_NAME=$(grep "company_name" file.txt); COMPANY_NAME=${COMPANY_NAME:: -1} 

Это лишит любого символа, точки с запятой или нет, но может также избавиться от точки с запятой.Чтобы удалить ВСЕ точки с запятой, где бы они ни находились:

echo ${COMPANY_NAME/;/}

Чтобы удалить только точку с запятой в конце:

echo ${COMPANY_NAME%;}

Или, чтобы удалить несколько точек с запятой с конца:

echo ${COMPANY_NAME%%;}

Для получения более подробной информации и подробностей об этом подходе проект документации Linux охватывает большую часть вопросов http://tldp.org/LDP/abs/html/string-manipulation.html

7 голосов
/ 18 мая 2013

Используя sed, если вы не знаете, какой на самом деле последний символ:

$ grep company_name file.txt | cut -d '=' -f2 | sed 's/.$//'
"Abc Inc"
5 голосов
/ 05 февраля 2013

Не злоупотребляйте cat с. Знаете ли вы, что grep тоже может читать файлы?

Канонический подход будет следующим:

grep "company_name" file.txt | cut -d '=' -f 2 | sed -e 's/;$//'

более разумный подход будет использовать один оператор perl или awk, который может выполнять фильтрацию и различные преобразования одновременно. Например что-то вроде этого:

COMPANY_NAME=$( perl -ne '/company_name=(.*);/ && print $1' file.txt )
3 голосов
/ 22 февраля 2011

не нужно связывать так много инструментов.Всего одна команда awk делает работу

 COMPANY_NAME=$(awk -F"=" '/company_name/{gsub(/;$/,"",$2) ;print $2}' file.txt)
1 голос
/ 01 февраля 2016

Некоторые уточнения, чтобы ответить выше. Чтобы удалить более одного символа, добавьте несколько знаков вопроса. Например, чтобы удалить два последних символа из переменной $ SRC_IP_MSG, вы можете использовать:

SRC_IP_MSG=${SRC_IP_MSG%??}
1 голос
/ 13 декабря 2012

Предполагая, что кавычки на самом деле являются частью вывода, не могли бы вы просто использовать ключ -o для возврата всего между кавычками?

COMPANY_NAME="\"ABC Inc\";" | echo $COMPANY_NAME | grep -o "\"*.*\""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...