Нет никакой "связи экстремального значения" с Unix и Unix как Ose.
Экстремальное отделение (т.е. Автономное программное обеспечение) было нормой в начале Unix в то время, когда все было на CLI.
Единственный известный двойной код был самими сценариями оболочки, когда им были нужны команды, они звонят, чтобы быть доступными. Большинство этих команд было частью стандартной установки хотя так, чтобы не была проблема.
Введение крупных библиотек как та, используемая с графическими средами (X11, инструментарии виджета и подобный), продемонстрированное встраивание всех необходимых библиотек в единственном исполняемом файле было неэффективно в обоих пространствах памяти (большие исполняемые файлы в то время, когда дисковое пространство было редко) и в использовании памяти (много дублирования того же кода, в то время, когда RAM была редка также). Общие объекты были затем представлены для преодоления этих ограничений.
Мы находимся теперь в ситуации, где дерево зависимостей для приложений может быть довольно сложным, обычно из-за необходимых библиотек и подобных файлов. Идея состоит в том, чтобы разработчики сконцентрировались на своих базовых приложениях, и усильте остаток к существующему материалу, т.е. не изобретать велосипед.
Это не должно создавать много проблем вне вызванных новой совместимостью повреждения версии с более старыми и именованием столкновений, исключая программное обеспечение для установки вместе на той же машине. Обеих из этих проблем банка (должны) избежать хороший дизайн и стандарты.
Это мало sed
команда может сделать задание:
sed -ne '
/^Name */{
s/^.*= *//;
h;
tb;
};
/^End/bb;
G;
s/^\(.*\) *= *\(.*\)\n\(.*\)$/\3\t\1\t\2/p;
:b
' <sourcefile.txt
x:y Z a:b.c
x:y Z1 a1:b1.c1
x1:y1 Z2 a2:b2.c2
x1:y1 Z3 a3:b3.c3
x1:y1 Z4 a4:b4.c4
l:k s w:e.v
Объясненный:
hold space
и переход для маркировки :b
.:b
.:b
(если еще): Добавить hold space
, чем если бы строка 'соответствия строки, сопровождаемая каким-либо количеством пробелов и знака "равно", некоторые пробелы, возможно, вторая строка, новая строка и наконец третья строка, то печатает третью строку, сопровождаемую вкладкой, сначала представляет в виде строки вкладку и затем вторую строку.while read line ;do
if [ ${line//=*} = "Name" ] ;then
name=${line//*=}
else
[ "${line//=*}" != "$line" ] &&
printf "%s\t%s\t%s\n" $name ${line//=}
fi
done <sourcefile.txt
x:y Z a:b.c
x:y Z1 a1:b1.c1
x1:y1 Z2 a2:b2.c2
x1:y1 Z3 a3:b3.c3
x1:y1 Z4 a4:b4.c4
l:k s w:e.v
Используя =
с дополнительным окружающим пробелом как разделитель:
awk -F '[[:blank:]]*=[[:blank:]]*' '
$1 == "Name" {name = $2; next}
$1 != "End" {print name, $1, $2}
' filename
При рассмотрении их awk
решения это может стать немного сбивающим с толку, что продолжается. При вставке некоторых хорошо помещенных операторов печати, можно начать видеть визуальным способом, что продолжается:
$ awk -F '[[:blank:]]*=[[:blank:]]*' '
$1 == "Name" { name = $2; print "--NAME: "$2; next };
$1 != "End" { print " --END: "name,$1,$2 }
' sample.txt
Который производит следующий вывод:
--NAME: x:y
--END: x:y Z a:b.c
--END: x:y Z1 a1:b1.c1
--NAME: x1:y1
--END: x1:y1 Z2 a2:b2.c2
--END: x1:y1 Z3 a3:b3.c3
--END: x1:y1 Z4 a4:b4.c4
--NAME: l:k
--END: l:k s w:e.v
F
. Скопируйте и вставьте команду, не перепечатывайте ее, за исключением Вашего имени файла.
– Kevin
26.08.2013, 22:35
[:blank:]
выражение скобки POSIX regular-expressions.info/posixbrackets.html. Это означает вкладку или пространство, и потому что это сопровождается *
это означает zero or more tabs or spaces
. Полное '[[:blank:]]*=[[:blank:]]*
будет соответствовать =
или '=' и т.д (со многими или никакими вкладками и пробелами вокруг равняется знаку).
– Drav Sloan
26.08.2013, 23:39
И вот Perl:
perl -ne 'if(/^Name\s*=\s*(.+)/){$n=$1;}else{print "$n $_" unless /^End/}' file
ОБЪЯСНЕНИЕ
perl -ne
средства обрабатывают входной файл линию за линией (-n
), сохраняя каждую строку в переменную $_
и запущенный скрипт, данный в качестве параметра -e
.
if(/Name\s*=\s*(.+)/){$n=$1;}
: если строка запускается с Name = <something>
, сохранить <something>
как $n
.
Еще, если строка не запускается с Name
, распечатайте текущее значение $n
, имя и остальная часть строки, если та строка не End
.