Как преобразовать, пишут сообщение таким образом, что каждая выходная строка запускается с заголовка блока?

Нет никакой "связи экстремального значения" с Unix и Unix как Ose.

Экстремальное отделение (т.е. Автономное программное обеспечение) было нормой в начале Unix в то время, когда все было на CLI.

Единственный известный двойной код был самими сценариями оболочки, когда им были нужны команды, они звонят, чтобы быть доступными. Большинство этих команд было частью стандартной установки хотя так, чтобы не была проблема.

Введение крупных библиотек как та, используемая с графическими средами (X11, инструментарии виджета и подобный), продемонстрированное встраивание всех необходимых библиотек в единственном исполняемом файле было неэффективно в обоих пространствах памяти (большие исполняемые файлы в то время, когда дисковое пространство было редко) и в использовании памяти (много дублирования того же кода, в то время, когда RAM была редка также). Общие объекты были затем представлены для преодоления этих ограничений.

Мы находимся теперь в ситуации, где дерево зависимостей для приложений может быть довольно сложным, обычно из-за необходимых библиотек и подобных файлов. Идея состоит в том, чтобы разработчики сконцентрировались на своих базовых приложениях, и усильте остаток к существующему материалу, т.е. не изобретать велосипед.

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

1
27.08.2013, 00:37
3 ответа

Способ использовать

Это мало 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
1
27.01.2020, 23:15

Используя = с дополнительным окружающим пробелом как разделитель:

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
5
27.01.2020, 23:15
  • 1
    @ahmed Это - капитал F. Скопируйте и вставьте команду, не перепечатывайте ее, за исключением Вашего имени файла. –  Kevin 26.08.2013, 22:35
  • 2
    я должен понять то, что подразумевает' [[: пробел:]] * = [[:blank:]] *' –  ahmed 26.08.2013, 22:42
  • 3
    [: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.

0
27.01.2020, 23:15

Теги

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