1

Доброго времени суток.

Есть задачка, заменить пробелы на "_" в файле, но не во всем тексте, а определенных участках.
Пример:

some text with spaces/another text with spaces which must be replaced
more some text with spaces/more another text with spaces which must be replaced

нужно заменить на:

some text with spaces/another_text_with_spaces_which_must_be_replaced
more some text with spaces/more_another_text_with_spaces_which_must_be_replaced

Пытаюсь так:

cat testfile | cut -d / -f2 | sed 's/\ /_/g'

testfile - файл, который содержит эти строки
cut -d / -f2 - делим текст с пом разделителя "/" на 2 части и берем 2-ю
sed 's/\ /_/g' - заменяем пробелы на подчеркивания
Но тогда замена происходит во всем тексте. Если убрать "g", то замена вообще не происходит.
Может кто подскажет, как произвести замену только во 2-й половинке?

2

 Консоль:
$ sed 'h;s~/.*~~;x;s~[^/]*/~~;s/ /_/g;H;g;s~\n~/~' 11.txt
some text with spaces/another_text_with_spaces_which_must_be_replaced
more some text with spaces/more_another_text_with_spaces_which_must_be_replaced

делал так-же как вы, используя Hold Space для хранения первой части строки.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

3

andro_id пишет:

sed 's/\ /_/g' - заменяем пробелы на подчеркивания

заменяет комбинацию кривозаписаный пробел на подчёркивание. без g заменяет только первый, с g заменяет все. Обратный слеш тут лишний. Пробельные символы записываются в sed так: \s.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

4

Спасибо за ответ. Сейчас вижу, что не совсем корректно описал строку, с которой производятся манипуляции. На самом деле она седержит не один "/", а несколько.

some text with spaces/some more text with spaces/more and more text with spaces/another_text_with_spaces_which_must_be_replaced

И замену мы делаем в определенной части, как правило последней.

Ваш пример я вижу так:
h;s~/.*~~;x;s~[^/]*/~~; - записать в hold space все символы до первого /
s/ /_/g; - в оставшемся заменить все пробелы на подчеркивания
H;g;s~\n~/~ - добавить к содержимому hold space измененную часть

Поправьте, если я не прав.
Непонятно обилие знаков ~, для чего он нужен?