я бы хотел, чтобы: файл содержит:
VAR_1|VALU_1
VAR_2|VALU_2
VAR_3|VALU_31
VALU_31
VALU_33
VAR_4|VALU_4
VAR_5|VALU_5
VAR_6|VALU_61
VALU_62
VAR_7|VALU_7
.....
Как я могу получить значение строки с помощью sed или другого?
Я пытаюсь :
sed -n '/^VAR_3|*/,/^[A-Z_]+/{;p}'
Спасибо за вашу помощь.
Представьте, что ваш ввод сохранен в файле с именем «test.txt», вы можете использовать «awk» со следующим синтаксисом:
awk -F '|' '/^VAR_3/ {print $2}' test.txt
Пример выполнения для введенных вами данных:
$ awk -F '|' '/^VAR_3/ {print $2}' test.txt
VALU_31
Вот базовое объяснение этой команды awk:
-F '|'
: определяет "|" (символ вертикальной черты) как разделитель полей
/^VAR_3/
: соответствует только строкам, начинающимся с "VAR_3"
{print $2}
: печатает второе поле / столбец (который в данном случае содержит значение, которое вы хотите распечатать)
ОБНОВЛЕНИЕ (3 декабря 2015 г.):
Итак, OP добавил поясняющий комментарий, который приводит к выводу, что он хочет, чтобы поиск был многострочным, учитывая, что строки между двумя «токенами» являются частью значения первого токена.
Вот исправленная версия начального примера, на этот раз с использованием символа "sed"(2 раза!) И"глава"команды:
$ sed -n '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//' | head -n -1
VALU_31
VALU_31
VALU_33
ХОРОШО. Выглядит хорошо :-) Посмотрим, верно ли это для случая с одной строкой:
$ sed -n '/VAR_4|/,/VAR_/p' test.txt | sed '1 s/VAR_4|//' | head -n -1
VALU_4
Хорошо. Так что это также работает для однострочных случаев!
Хорошо ли работает, если искомая строка НЕ находится на входе? Давай попробуем это для VAR_0
(который НЕ существует в данном примере):
$ sed -n '/VAR_0|/,/VAR_/p' test.txt | sed '1 s/VAR_0|//' | head -n -1
$
Отлично. Так что, похоже, это работает в нескольких случаях (хотя я думаю, могут быть более эффективные решения).
Так, как это работает? Вот краткое изложение примера "VAR_3" ...
Первая часть - sed -n '/VAR_3|/,/VAR_/p' test.txt
- возвращает следующий результат:
$ sed -n '/VAR_3|/,/VAR_/p' test.txt
VAR_3|VALU_31
VALU_31
VALU_33
VAR_4|VALU_4
Итак, эта часть в основном соответствует всему между VAR_3
и следующее появление VAR_
. Как мы видим, эта часть, похоже, возвращает то, что мы хотим ... ПЛЮС две вещи, которые мы НЕ хотим: "VAR_3|
"в первой строке -И- последней строке.
Итак, мы передаем этот первый вывод в другую инструкцию sed, которая применяется только к первой строке, и заменяем строку "VAR_3|
"ничем, эффективно удаляя его:
$ sed -n '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//'
VALU_31
VALU_31
VALU_33
VAR_4|VALU_4
"1
"предназначен для применения команды sed к первой строке ... И мы НЕ хотим включать эту последнюю строку, поэтому мы направляем этот вывод в"глава"команда с"-n
"(" MINUS n ") переключатель - конкретно"-n 1
"исключить последнюю строку:
$ sed -n '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//' | head -n -1
VALU_31
VALU_31
VALU_33
Это здорово. Я хотел бы заменить "VAR_" на "sed -n '/ VAR_3 | /, /VAR_/ p 'test.txt | sed '1 s / VAR_3 | //' | head -n -1 "чем-то вроде этого: sed -n" / $ SEEK | /, /^ [A-Z _-] + \ |/ p "get-server-infos.txt | sed" 1 s / $ SEEK | // "| head -n -1
Мое имя VARS всегда имеет следующий формат: "^ [A-Z _-] + | *"
Начинается с заглавной буквы и может содержать «-» и «_» и всегда содержать «|».
Большое спасибо за вашу помощь.