Ответ 1
Я бы использовал sed 's/;$//'
. например:
COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | sed 's/;$//'`
COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2`
выводит что-то вроде этого
"Abc Inc";
Что я хочу сделать, так это я хочу удалить трейлинг ";" также. Как я могу это сделать? Я новичок до bash. Любые мысли или предложения будут полезны.
Я бы использовал sed 's/;$//'
. например:
COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | sed 's/;$//'`
Это приведет к удалению последнего символа, содержащегося в вашей переменной COMPANY_NAME, независимо от того, является ли она точкой с запятой или нет:
echo "$COMPANY_NAME" | rev | cut -c 2- | rev
foo="hello world"
echo ${foo%?}
hello worl
Я бы использовал 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
, таким образом, меньше параметров командной строки и более легкой для чтения командыЯ считаю, что самый чистый способ разделить один символ из строки с помощью 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
Используя sed
, если вы не знаете, что такое последний символ:
$ grep company_name file.txt | cut -d '=' -f2 | sed 's/.$//'
"Abc Inc"
Не злоупотребляйте 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 )
не нужно связывать так много инструментов. Только одна команда awk выполняет задание
COMPANY_NAME=$(awk -F"=" '/company_name/{gsub(/;$/,"",$2) ;print $2}' file.txt)
В Bash используется только одна внешняя утилита:
IFS='= ' read -r discard COMPANY_NAME <<< $(grep "company_name" file.txt)
COMPANY_NAME=${COMPANY_NAME/%?}
Предполагая, что кавычки на самом деле являются частью вывода, не могли бы вы просто использовать ключ -o для возврата всего между кавычками?
COMPANY_NAME="\"ABC Inc\";" | echo $COMPANY_NAME | grep -o "\"*.*\""
Некоторые уточнения для ответа выше. Чтобы удалить более одного char, вы добавляете несколько вопросительных знаков. Например, чтобы удалить последние два символа из переменной $SRC_IP_MSG, вы можете использовать:
SRC_IP_MSG=${SRC_IP_MSG%??}
cat file.txt | grep "company_name" | cut -d '=' -f 2 | cut -d ';' -f 1
Я не нахожу, что работает sed 's/;$//'
. Он ничего не обрезает, хотя мне интересно, не потому ли, что персонаж, которого я пытаюсь урезать, оказывается "$". Для меня работает sed 's/.\{1\}$//'
.
вы можете разбить начало и конец строки на 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