Как извлечь строку версии, определенную в первой строке файла в bash - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу извлечь строку версии, которая определена в первой строке файла.

file.txt

version="11.22.33" project="foo"
this is a foo project with version "11.22.33" written in some language of version "44.55.66"

Я хотел бы получить команду, которая будет считывать только первую строку файла, извлекать 11.22.33 из него и останавливать.

Я попытался variable_str=$(sed -rn "0,/<pattern_for_version>/p"), но это возвращает всю строку, а не только сопоставленный шаблон.

Ответы [ 4 ]

0 голосов
/ 05 ноября 2018
$ awk -F\" '{print $2; exit}' file
11.22.33
0 голосов
/ 05 ноября 2018

проще head первой строке и второй извлечь шаблон

head -1 file.txt | sed 's#.*version=\(\"[^"]*\"\).*#\1#' 

Вы используете sed поиск и замену: Парантезы (которые необходимо экранировать) записывают требуемый шаблон (двойная кавычка, все, кроме двойной кавычки, двойной кавычки). Замена - это просто записанный шаблон (\1).

0 голосов
/ 05 ноября 2018

зачем порождать другой процесс?

$: IFS="$IFS=" read x version x < file.txt
$: echo "$version"
"11.22.33"

IFS - это список внутренних разделителей полей, который по умолчанию включает пробелы, табуляции и переводы строк. Если вы добавите =, то одно чтение файла приведет к разбивке первой строки на столько полей, сколько вы просили.

версия "11.22.33" project = "foo"

Он назначит их указанным переменным, поэтому предоставьте им места для размещения начального поля, которое вы не хотите, и всего, что находится за полем, которое вы действительно хотите, и оно будет аккуратно перетаскивать значение версии туда, где вы этого хотите.

Если вы не предоставите достаточно, в последнем поле все останется непарсированным -

$: echo $x
project="foo"

Если вы хотите удалить кавычки, добавьте также " к IFS и укажите место для пустого поля, которое будет получено. Чтобы удалить одиночные кавычки, добавить их и т. Д. *

$: IFS="$IFS='\"" read x x version x < file.txt
$: echo "$version"
11.22.33
0 голосов
/ 05 ноября 2018

Вы можете попробовать это

awk -F "[= ]" 'NR==1 {gsub(/\"/,"",$2);print $2}' file.txt

NR - это номер строки, а -F обозначает разделитель полей, в данном случае равный пробелу. Если вы хотите кавычки

awk -F "[= ]" 'NR==1 {print $2}' file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...