LINUX.ORG.RU

удалить абзац (

 ,


0

1

с помощью sed пытаюсь зацепить знак абзаца. Не пойму как он обозначается. Ну типа заменить АбзацAAA на \tAAA

Ну или любой символ до ААА

Перемещено hobbit из general



Последнее исправление: Steh (всего исправлений: 1)

Ответ на: комментарий от ox55ff

ну он строки игнорирует наверное, построчно обрабатывает, у меня не заменяет. Я так ввел find /temp/ -name ’** -exec sed -i -e ’s/\x0aAAA … x0A тоже пробовал

Есть код какой-нибудь для другого редактора?

Steh
() автор топика
Ответ на: комментарий от Steh

Символ U+000A известен, как символ Перевода строки LF (Line Feed) или Символ новой строки NL (New Line).

ну, ерунду-то не пори!… это два разных символа с разными кодами

  • возврат каретки (CR) 0x0D
  • подача бумаги (LF) 0x0A

а символ «новой строки» в разных ОС образуется из комбинаций вышеозвученных символов.

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)

Нет символа начала абзаца. Если вам нужно заменить символ перевода строки '\n' на табуляцию, то это

tr '\n' '\t'

А если у вас абзацы отмечаются двумя подряд символами '\n' (пустой строкой), то так sed работает со строками, и для него такая последовательность будет две строки, то нужно использовать буфер хранения (hold space), как-то так:

sed '/^$/N;s/\n/\t/'

mky ★★★★★
()
Ответ на: комментарий от mky

это все вредные советы, скорее всего sed не видит концов строки. Не работает оно так с find. tr также не знаю как использовать для множества файлов. Если бы один надо было заменить, сделал бы в блокноте

Steh
() автор топика
Ответ на: комментарий от Steh

это все вредные советы

Вы ведь даже не стали читать, что такое hold space у sed. Не стали смотреть, что у sed делает команда N...

sed не видит концов строки.

sed видит концы строк и обрабатывает их как концы строк. Хотите, чтобы конец строки оказался в обрабатываемой sed'ом строке, засовывайте строки в буфер. N не очень удобная команад, в GNU-sed она работает с последней строкой иначе чем в других sed'ах, поэтому лучше использовать буфер хранения (hold space).

Если по тупому, можете засовывать весь файл в hold space и применять к нему регулярку, тогда там будут концы строк:

sed -n 'H;1h;${x;s/\nAAA/\tAAA/gp}'
или
sed 'H;1h;$!d;x;s/\nAAA/\tAAA/g'
Но что будет, если файл не влезет в этот буфер не знаю. И тогда нужно будет писать sed-скрипт, который опустошает буфер хранения, если строка не начинается с AAA.

mky ★★★★★
()
Ответ на: комментарий от Steh

Просили заменить ″АбзацAAA″, которое потом стало ″\nAAA″, а пишете выражение для ″AAA\n″.

Попутно, вы не уточнили, первая строка в файле — это начало абзаца?

А про вашу конструкцию: https://unix.stackexchange.com/questions/182153/sed-read-whole-file-into-patt...

mky ★★★★★
()