Невозможно заменить di git новой строкой в ​​sed, но можно заменить в возвышенном - PullRequest
2 голосов
/ 13 марта 2020

У меня есть документ с несколькими строками. Я хочу заменить символы новой строки в строках, которые не заканчиваются цифрами

Предположим, документ:

line1
line2
line
line
line
line4

Я хочу получить

line1
line2
linelinelineline4

Я могу сделать это возвышенно, заменив ([^\d])(\n) на \1. При попытке это в Sed это не работает. Может кто-нибудь помочь мне, что в этом плохого? Заранее спасибо

Ответы [ 3 ]

1 голос
/ 13 марта 2020

Не могли бы вы попробовать следующее:

sed '/[^[:digit:]]$/{   ;# if current line ends with non-number
:l                      ;# define a label "l"
N                       ;# read the next line and append to the pattern space
s/\n//                  ;# remove the newline
/[[:digit:]]$/b         ;# if the appended line ends with number, exit the loop
bl                      ;# jump to label "l" and repeat
}' file
1 голос
/ 13 марта 2020

Это может работать для вас (GNU sed):

sed ':a;N;/[^0-9]\n/s/\n//;ta;P;D' file

Добавьте следующую строку, и, если первая строка не заканчивается на di git, удалите символ новой строки и повторите. В противном случае напечатайте / удалите первую строку и повторите.

1 голос
/ 13 марта 2020

sed не поддерживает \d, вместо этого вы можете использовать [0-9]. Также по умолчанию sed работает построчно, и вы не можете манипулировать символом \n в конце строки. Есть способы преодолеть это, но я бы не советовал использовать sed для этой задачи.

$ awk '{ORS = /[0-9]$/ ? RS : ""} 1' ip.txt
line1
line2
linelinelineline4
  • ORS - это разделитель выходной записи
  • /[0-9]$/ проверьте, заканчивается ли строка ввода цифрой
    • , если это так, используйте RS как ORS (по умолчанию \n)
    • , используйте пустую строку
  • 1 - это идиома awk в качестве ярлыка для печати содержимого $0 (входная запись)


perl позволяет манипулировать символом новой строки поскольку он не удаляется и не добавляется обратно, как sed или awk

$ perl -pe 's/(?<!\d)\n//' ip.txt
line1
line2
linelinelineline4
...