Что именно делает этот сценарий? [дубликат]

Вы можете использовать команду ниже:

grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'| awk '{ print $2, $4}'

он выдаст такой результат:

ABC 7
XYZ 9

РЕДАКТИРОВАТЬ:

Команда ниже выдаст строку со строкой name или age

grep -E "name|age" filename

name=ABC
age=7
name=XYZ
age=9

Эта команда сделает одну строку из двух строк

grep -E "name|age" filename | sed 'N;s/\n/ /'
name=ABC age=7
name=XYZ age=9

Команда ниже удалит знак равенства = from output

grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'
name ABC age 7
name XYZ age 9

Команда ниже выводит ваш requiremnt

grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'| awk '{ print $2, $4}'
ABC 7
XYZ 9

awk , выводит 2-й и 4-й аргумент предыдущего вывода команды

, тем не менее, вы сталкиваетесь с любой проблемой, чтобы понять любой синтаксис, который Google может подробно объяснить :).

2
19.12.2016, 21:17
2 ответа

Как вы уже догадались, $ {var /% flac / mp3} заменяет окончание «flac» (если есть) в значении $ var с «mp3» . "$ {var [@] /% flac / mp3}" будет делать то же самое для каждого элемента, выводимого $ {var [@]} if var был массивом.

Здесь, поскольку a не является массивом, вы можете удалить [@] (я предполагаю, что это наследие предыдущих попыток программиста).

4
27.01.2020, 21:54

Здесь выполняется простое расширение оболочки. Переменная a будет перебирать все файлы, соответствующие глобусу *.flac.

Поскольку каждая запись будет файлом (и я предполагаю отсутствие пробелов в именах файлов), foo.flac будет расширением $a и ${a[@]}.

Конструкция ${var/%foo/bar} заменит foo на bar в конце переменной var. Таким образом, она заменяет расширение flac на расширение mp3 в вашем примере, чтобы обеспечить ffmpeg выходное имя файла.

2
27.01.2020, 21:54

Теги

Похожие вопросы