Получить подстроку из файла используя "sed" - PullRequest
4 голосов
/ 13 января 2012

Может ли кто-нибудь помочь мне получить подстроку с помощью программы sed ?

У меня есть файл с этой строкой:

....
define("BASE", "empty"); # there can be any string (not only "empty").
....

И мне нужно получить "empty" как строковую переменную для моего bash-скрипта.

На данный момент у меня есть:

sed -n '/define(\"BASE\"/p' path/to/file.ext
# returns this line:
# define("BASE", "empty");
# but I need 'empty'

UPD: Благодаря @ Jaypal

На данный момент у меня есть скрипт bash:

DBNAME=`sed -n '/define(\"BASE\"/p' path/to/file.ext`
echo $DBNAME | sed -r 's/.*"([a-zA-Z]+)".*/\1/'

Работает нормально, но есть ли способ сделать те же манипуляции с одной строкой кода?

Ответы [ 4 ]

6 голосов
/ 13 января 2012

Вы должны использовать это

sed -n 's/.*\".*\", \"\(.*\)\".*/\1/p' yourFile.txt

что означает что-то (.*), за которым следует что-то в кавычках (\".*\"), затем запятая и пробел (,), а затем снова что-то в кавычках (\"\(.*\)\").

Скобки определяют часть, которую вы позже можете использовать повторно, то есть строку во вторых кавычках. использовал его с \1.

Я поставил -n на передний план, чтобы ответить на обновленный вопрос, чтобы подключиться к линии, которой манипулировали.

3 голосов
/ 13 января 2012

Это должно помочь -

sed -r 's/.*"([a-zA-Z]+)"\);/\1/' path/to/file.ext

Если вы в порядке с awk, тогда вы можете попробовать следующее -

awk -F\" '/define\(/{print $(NF-1)}' path/to/file.ext

Обновление:

DBNAME=$(sed -r '/define\(\"BASE\"/s/.*"([a-zA-Z]+)"\);/\1/' path/to/file.ext)
1 голос
/ 15 мая 2013
 sed -nr '/^define.*"(.*)".*$/{s//\1/;p}' path/to/file.ext
0 голосов
/ 25 февраля 2018

если ваш файл не изменяется со временем (т.е. номера строк всегда будут одинаковыми ), вы можете взять строку и использовать разделители, чтобы вывести свою часть:

`sed -n 'Xp' your.file  | cut -d ' ' -f 2 |cut -d "\"" -f 2`

при условии, что X - это номер требуемой строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...