SED, чтобы обернуть строки в текстовом файле? - PullRequest
1 голос
/ 10 марта 2011

Я новичок с Седом. У меня есть куча файлов ASCII, содержащих данные, которые выложены так:

Test_Version:2.6.3
Model-Manufacturer:
HR21-100
Test_Version:2.6.3
Model-Manufacturer:
D12-100

Все, что я хочу сделать, это сложить строки для «Модель-Производитель:» следующим образом:

Test_Version:2.6.3
Model-Manufacturer:HR21-100
Test_Version:2.6.3
Model-Manufacturer:D12-100

Я пытался использовать sed, так как обнаружил, что есть 2 шестнадцатеричных значения (0xA для \ n) после «Model-Manufacturer:»

cat myfile| sed -n "/[[:xdigit:]]\{2\}/p"

Вывод выглядел следующим образом для моего кода совпадения:

Model-Manufacturer:
HR21-100
Model-Manufacturer:
D12-100

Это говорит мне, что я на правильном пути, верно? То, что я не могу понять, - это правильный код соответствия / замены, чтобы сложить строки для «Модель-Производитель:». Попытка с

cat myfile| sed "s/[[:xdigit:]]\{3\}//g"

закончен испортил мой файл. Есть идеи как это сделать?

Ответы [ 3 ]

5 голосов
/ 10 марта 2011
$ cat test.txt
Test_Version:2.6.3
Model-Manufacturer:
HR21-100
Test_Version:2.6.3
Model-Manufacturer:
D12-100

$ cat test.txt | sed -e '/:$/N; s/:\n/:/'
Test_Version:2.6.3
Model-Manufacturer:HR21-100
Test_Version:2.6.3
Model-Manufacturer:D12-100

Вот разбивка каждой команды sed.

/:$/N

Если в строке ввода указан символ «:», вставьте новую строку в конце пространства шаблона и добавьтеследующая строка ввода.

s/:\n/:/

Замените ":", за которым следует символ новой строки на ":", удалив символ новой строки.

2 голосов
/ 10 марта 2011

Выражение в скобках [[:xdigit:]] соответствует любому из текста символов 01234567890abcdefABCDEF. По этой причине отображается для сопоставления с использованием того, что вы пытались - потому что в этих строках есть символы "e", "a", "1", "2" и "0". Если вы хотите сопоставить любой непечатаемый символ, вы можете использовать [[:cntrl:]]. Однако для точного соответствия новой строки вы можете использовать \n, \x0a, \o12 или \d10.

Однако, это не совсем то, что вы хотите сделать, поскольку sed не видит символ новой строки в конце каждой строки. Он видит их только в том случае, если они заключены в строки, которые он складывает вместе.

Вот команда sed, которая добавляет нужные строки вместе:

sed '/Model-Manufacturer:/{N;s/\n//}' myfile

Пояснение:

  • /Model-Manufacturer:/{ - Если строка соответствует «Модель-Производитель:»
    • N - Добавить следующую строку
    • s/\n// - Удалить встроенный символ новой строки, добавленный операцией добавления
  • } - конец, если
0 голосов
/ 10 марта 2011

Вы также можете использовать awk

gawk '/Model/{printf $0;getline;print;next}1' file
...