Соединяйте линии по шаблону. Неравномерный интервал - PullRequest
6 голосов
/ 26 марта 2020

Если у меня есть это ...

6,
9,
12
"url": "https://www.url.com"
6,
9,
12
"url": "https://www.url.com"
13,
16
"url": "https://www.url.com"
"url": "https://www.url.com"
18
"url": "https://www.url.com"
"url": "https://www.url.com"
3,
6,
14
"url": "https://www.url.com"
"url": "https://www.url.com"
20
"url": "https://www.url.com"
74
"url": "https://www.url.com"

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

6,9,12"url": "https://www.url.com"
6,9,12"url": "https://www.url.com"
13,16"url": "https://www.url.com"
"url": "https://www.url.com"
18"url": "https://www.url.com"
"url": "https://www.url.com"
3,6,14"url": "https://www.url.com"
"url": "https://www.url.com"
20"url": "https://www.url.com"
74"url": "https://www.url.com"

Я пытался использовать sed для удалите новую строку в строках, которые начинаются с цифры, но это не работает. Я думаю, потому что линии меняются по мере его работы?

sed '/^[0-9]/N;s/\n//'

Я получаю это ...

6,9,
12"url": "https://www.url.com"
6,9,
12"url": "https://www.url.com"
13,16
"url": "https://www.url.com"
"url": "https://www.url.com"
18"url": "https://www.url.com"
"url": "https://www.url.com"
3,6,
14"url": "https://www.url.com"
"url": "https://www.url.com"
20"url": "https://www.url.com"
74"url": "https://www.url.com"

РЕДАКТИРОВАТЬ: Спасибо за помощь и объяснения. Я пошел с этим, потому что мне было легче понять. Они все работали, хотя. sed ':a;/https/!{N;ba};s/\n//g'

Ответы [ 4 ]

5 голосов
/ 26 марта 2020

В одну сторону, используя :

awk '{ printf("%s%s", $0, /^[0-9]/ ? "" : "\n") }' file.txt
5 голосов
/ 26 марта 2020

Следующий код должен работать:

sed ':a;/https/!{N;ba};s/\n//g'

По сути, это время l oop, которое добавляет строку за строкой, если исходящая многострочная строка не содержит https; как только добавляется одна строка, содержащая https, в то время как l oop отменяется (так как команда b не выполняется), и все встроенные символы новой строки \n удаляются с помощью команды s.

Более подробно, скрипт (между одинарными кавычками) можно переписать так:

:a        # label you can jump to with a t or b command
/https/!{ # if the line does not match "https" do what's in {…}:
    N     #   append the next line to the current one (putting "\n" in between)
    ba    #   branch to the line labelled as ":a"
}
s/\n//g   # change all newlines to empty strings (i.e. remove all newlines for the current multi-line)

Соответствующий псевдокод будет

begin
while line does not contain "https" {
  append another line
}
remove all newlines
3 голосов
/ 26 марта 2020
sed '/^[0-9]/{H;d};H;s/.*//;x;s/\n//g'
  • /^[0-9]/ - Если строка начинается с ди git.
    • H - добавить строку в качестве пробела.
    • d - удалить строку и начать заново.
  • Если строка соответствует не начинаться с ди git
  • H - добавить строку для пробела во все цифры.
  • s/.*// - очистить пробел. Я хочу очистить удерживающее пространство.
  • x - Переключить пространство образца с удерживающим пространством.
  • s/\n//g - Заменить все символы новой строки на ничто.
  • И здесь печатается строка с цифрами.
0 голосов
/ 26 марта 2020

Если ваш шаблон находится в файле + .txt: -

Сохраните его как скрипт +. ​​sh или как хотите, чтобы он назывался.

#!/bin/sh -x

init () {
rm -v ./report+.txt

cat > edchop+.txt << EOF
1,${line}w temp
1,${line}d
wq
EOF

next
}

end () {
rm -v ./edchop+.txt
rm -v ./temp
exit 0
}

next () {
[[ -s file+.txt ]] && main
end
}

main () {
line=$(echo "/url/n" | ed -s file+.txt | cut -b1)
ed -s file+.txt < edchop+.txt
sed -i s'/com\"/com\"-/g' temp
cat temp | tr -d '\n' | tr '-' '\n' >> report+.txt
next
}

init

В ретроспективе немного хакерский Я использовал суффикс .com в веб-адресе как якорь новой строки с помощью sed и tr; вам нужно будет изменить это на любой домен, который вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...