Вопрос или проблема
Я пытаюсь извлечь текст между специальными символами. Вы можете следовать ниже, чтобы понять, что я пытаюсь сделать. У меня есть необходимые команды для этого, однако я ищу более эффективный способ, если некоторые условия могут измениться в зависимости от результата.
Ниже представлен текст On-Line (Prim) для примера. Я хочу извлечь любой текст между “–” 1-м и 2-м вхождением.
Таким образом, у меня есть текст ниже в переменной “VAL1”
IBM Informix Dynamic Server Version 14.10.FC10XA -- On-Line (Prim) -- Up 77 days 23:08:31 -- 130337920 Kbytes
В настоящее время я использую следующее:
echo "$VAL1" | awk -F'--' '$1 ~ /Version/ {print $2}'
Вышеупомянутое дает следующий вывод:
On-Line (Prim)
Однако вы не можете увидеть, что в конце строки необходимо наличие пробела, но начало очень заметно. Я хочу убедиться, что я распечатываю только слова между “–“, исключая любые пробелы до и после предложения внутри “–“.
Таким образом, я попытался использовать следующее, что мне кажется приемлемым:
echo "$VAL1" | awk -F'--' '$1 ~ /Version/ {print $2}' | sed 's/^ //g' | sed 's/ *$//'
Вывод:
On-Line (Prim)
Я хочу знать, есть ли лучший и более простой способ сделать это, который более эффективен?
Просто расширьте ваш разделитель полей с --
на --
…
echo 'IBM Informix Dynamic Server Version 14.10.FC10XA -- On-Line (Prim) -- Up 77 days 23:08:31 -- 130337920 Kbytes' |
awk -F' -- ' '{print $2}'
On-Line (Prim)
Или, чтобы распечатать его только в том случае, если в строке есть как минимум 2 вхождения --
:
echo 'IBM Informix Dynamic Server Version 14.10.FC10XA -- On-Line (Prim) -- Up 77 days 23:08:31 -- 130337920 Kbytes' |
awk -F' -- ' 'NF > 2 {print $2}'
On-Line (Prim)
Или другой вариант – использовать gsub
в awk:
echo 'IBM Informix Dynamic Server Version 14.10.FC10XA -- On-Line (Prim) -- Up 77 days 23:08:31 -- 130337920 Kbytes' | awk -F'--' '{gsub(/^ +| +$/,"",$2);print $2}'
On-Line (Prim)
Ответ или решение
Для решения задачи извлечения текста между специальными символами, в данном случае двойными тире "–", и удаления начальных и конечных пробелов, существует несколько эффективных подходов, которые могут значительно упростить вашу работу.
Проблема
Вы сталкиваетесь с необходимостью извлекать текст из строки, содержащей специальные символы, и гарантировать, что результат будет без пробелов по краям. Ваша исходная строка выглядит следующим образом:
IBM Informix Dynamic Server Version 14.10.FC10XA -- On-Line (Prim) -- Up 77 days 23:08:31 -- 130337920 Kbytes
Вы уже пробовали использовать awk
и sed
для решения этой задачи, однако хотите знать, существует ли более простое и эффективное решение.
Решения
-
Использование
awk
с расширенным разделителем:Вы можете легко избежать лишних пробелов, изменив разделитель в
awk
на' -- '
, чтобы учесть пробелы перед и после тире:echo "$VAL1" | awk -F' -- ' '{print $2}'
Это решение эффективно извлекает текст между первым и вторым вхождением " — ", исключая лишние пробелы.
-
Проверка количества вхождений:
Если важно убедиться, что в строке как минимум два вхождения " — ", вы можете использовать:
echo "$VAL1" | awk -F' -- ' 'NF > 2 {print $2}'
Это условие позволит вам обрабатывать только строки с необходимым количеством разделителей.
-
Замена пробелов с помощью
gsub
:Альтернативой вышеописанным методам является использование функции
gsub
вawk
. Это позволит вам удалить пробелы по краям текста без необходимости дополнительного вызова команд:echo "$VAL1" | awk -F'--' '{gsub(/^ +| +$/, "", $2); print $2}'
Этот метод также обеспечивает необходимую очистку текста и возвращает только нужную строку.
Заключение
Каждый из представленных подходов имеет свои преимущества в зависимости от вашего конкретного сценария использования. Если вы ищете максимально краткое и эффективное решение, используйте вариант с awk
и изменённым разделителем. Если же требуется больше контроля над условиями, подход с проверкой количества вхождений будет более подходящим.
Дополнительные рекомендации
- При использовании
awk
, лучше всего всегда тестировать на разных входных данных, чтобы убедиться в надежности решения. - Внимательно относитесь к пробелам и всем деталям в ваших данных, особенно если строки могут изменяться по формату.
Следуя этим рекомендациям, вы сможете легко и эффективно обрабатывать текстовые данные и извлекать необходимую информацию.