Назад | Перейти на главную страницу

как получить значение переменной в файле с помощью sed

я бы хотел, чтобы: файл содержит:

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 _-] + | *"
Начинается с заглавной буквы и может содержать «-» и «_» и всегда содержать «|».

Большое спасибо за вашу помощь.