Есть ли лучший способ захватить часть строки (которая не соответствует) с помощью sed и добавить ее в конец? - PullRequest
2 голосов
/ 08 июля 2019

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

Это файл примера с тысячами строк (входные данные):

Group: ch.qos.lback Name: lback.sa Version: 0.1.11 
Manifest Project URL: http://www.xx.x
Manifest license URL: http://www.xx.x/l.html
SUM License: Abra Nabra License - v 3.0 \- http://www.xx.x/l.html
SUM License: GNU Lesser General Public License \- http://www.gnu.org/licenses/lhtml

Group: com.aol.sim Name: cycact Version: 3.0.0-RT 
SUM Project URL: https://xx.com/xx
SUM License: The Apache Software License, Version 2.0 \- http://www.apache.org/licenses/LICENSE-2.0.txt

Group: com.fa Name: ce Version: 1.3.4 
SUM License: The Apache Software License, Version 2.0 \- http://www.apache.org/licenses/LICENSE-2.0.txt
Embedded license: cle-1.3.4.jar/META-INF/LICENSE cle-1.3.4.jar/META-INF/NOTICE

Что бы я хотелНапример, желаемый вывод:

Group: ch.qos.lback Name: lback.sa Version: 0.1.11 
Manifest Project URL: http://www.xx.x
Manifest license URL: http://www.xx.x/l.html
SUM License: Abra Nabra License - v 3.0 \- http://www.xx.x/l.html;Abra Nabra License - v 3.0
SUM License: GNU Lesser General Public License \- http://www.gnu.org/licenses/lhtml;GNU Lesser General Public License

Group: com.aol.sim Name: cycact Version: 3.0.0-RT 
SUM Project URL: https://xx.com/xx
SUM License: The MIT License, Version 2.0 \- http://www.x.x.txt;The MIT License, Version 2.0

Group: com.fa Name: ce Version: 1.3.4 
SUM License: The Apache Software License, Version 2.0 \- http://www.apache.org/licenses/LICENSE-2.0.txt;The Apache Software License, Version 2.0
Embedded license: cle-1.3.4.jar/META-INF/LICENSE cle-1.3.4.jar/META-INF/NOTICE

, поэтому, в основном, извлеките имя лицензии и добавьте его в конец.

e.g. ;Abra Nabra License - v 3.0

Я могу сделать следующее, чтобы получить строку между ними и сохранитьв переменной:

var=$(echo "SUM License: Apache License, Version 2.0 \- http://www.apache.org/licenses/LICENSE-2.0" | gsed -n 's/.*\SUM License: \(.*\)\http.*/\1/p')

и затем добавьте его в конец файла, выполнив еще один sed с циклом while:

gsed "/^SUM License:/ s/$/;$var;/"

Есть ли лучший способ сделать это?где я могу копировать и добавлять, не возиться много?

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Вы можете сопоставить любые символы, отличные от / после SUM License:, и захватить их в группу 1 при сопоставлении с остальной частью строки, а затем использовать &;\1 в шаблоне замены, чтобы добавить захваченное имя после точки с запятой в конце строки, где произошло совпадение:

sed 's/^SUM License: *\([^\]*\).*/&;\1/'

См. онлайн sed демо .

Детали шаблона POSIX BRE

  • ^ - начало строки
  • SUM License: - буквенная строка
  • * - 0 или более пробелов
  • \([^\]*\) - Группа захвата 1: любые 0 или более символов, кроме \
  • .* - остаток строки.

RHS подробности

  • & - значение всего совпадения
  • ; - точка с запятой
  • \1 - заполнитель значения группы 1.
0 голосов
/ 08 июля 2019

Итак, глядя на строку

SUM License: Abra Nabra License - v 3.0 \- http://www.xx.x/l.html

Всегда ли она начинается с SUM License:?Всегда ли в конце лицензии указывается \- http://?

Если это возможно, вы можете использовать это как правило sed, сначала выдавая исходное содержимое строки?

s/^(SUM License: )(.*)( \- http:)(.*)$/\1\2\3\4;\2/

Поддерживает ли ваш sed \ 0?Затем это становится:

s/^(SUM License: )(.*)( \- http:)(.*)$/\0;\2/

Вы также можете опустить лишние скобки.

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

...