Подтвердить что ты не робот

Как удалить последний символ из вывода bash grep

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

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

"Abc Inc";

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

echo "$COMPANY_NAME" | rev | cut -c 2- | rev

Ответ 3

foo="hello world"
echo ${foo%?}
hello worl

Ответ 4

Я бы использовал 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 выводит все, кроме последних десяти.

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

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

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

Ответ 5

Я считаю, что самый чистый способ разделить один символ из строки с помощью 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

Ответ 6

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

$ grep company_name file.txt | cut -d '=' -f2 | sed 's/.$//'
"Abc Inc"

Ответ 7

Не злоупотребляйте cat s. Знаете ли вы, что 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 )

Ответ 8

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

 COMPANY_NAME=$(awk -F"=" '/company_name/{gsub(/;$/,"",$2) ;print $2}' file.txt)

Ответ 9

В Bash используется только одна внешняя утилита:

IFS='= ' read -r discard COMPANY_NAME <<< $(grep "company_name" file.txt)
COMPANY_NAME=${COMPANY_NAME/%?}

Ответ 10

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

COMPANY_NAME="\"ABC Inc\";" | echo $COMPANY_NAME | grep -o "\"*.*\""

Ответ 11

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

SRC_IP_MSG=${SRC_IP_MSG%??}

Ответ 12

cat file.txt | grep "company_name" | cut -d '=' -f 2 | cut -d ';' -f 1

Ответ 13

Я не нахожу, что работает sed 's/;$//'. Он ничего не обрезает, хотя мне интересно, не потому ли, что персонаж, которого я пытаюсь урезать, оказывается "$". Для меня работает sed 's/.\{1\}$//'.

Ответ 14

вы можете разбить начало и конец строки на N символов, используя эту конструкцию bash, как уже сказал кто-то

$ fred=abcdefg.rpm
$ echo ${fred:1:-4}
bcdefg

ОДНАКО, это не поддерживается в более старых версиях bash.., поскольку я обнаружил, что сейчас пишу script для процесса установки Red Hat EL6. Это единственная причина для публикации здесь. Хакерный способ добиться этого - использовать sed с расширенным регулярным выражением следующим образом:

$ fred=abcdefg.rpm
$ echo $fred | sed -re 's/^.(.*)....$/\1/g'
bcdefg