Вопрос о sed

Может ли кто-нибудь помочь мне с sed, чтобы изменить эту глобальную строку в документе:

432 |---|1 M a n y - w o r d s !|---| (123.WORDS)

To:

432 |---|1.M.a.n.y.-.w.o.r.d.s.!|---| (123.WORDS)
0
задан 23 October 2017 в 12:10

6 ответов

Я бы использовал Perl, а не sed:

perl -naF'/\|/' -e '$F[2] =~ tr/ /./; print join "|", @F' -n читает ввод строки за строкой -a, разбивая каждую строку на массив @F F '/\|/', используя вертикальную полосу буква в качестве разделителя при расщеплении $F[2] содержит третий столбец tr - оператор транслитерации, он заменяет пробелы точками в третьем столбце join, соединяет столбцы массива назад (см. join)
0
ответ дан 18 July 2018 в 04:48

Попробуйте выполнить эту команду sed:

sed 's/\s/./g;s/432./432 /;s/!|---|./!|---| /' source.txt

И, конечно, вы можете сделать substitution на месте с помощью sed -i или отправить его в другой файл с помощью sed ... > output.txt

g: глобальная опция

1
ответ дан 18 July 2018 в 04:48

Если вы хотите изменить все пробелы между двумя вхождениями |---| с точками, используйте

sed 'h;s/ /./g;G;s/.*\(|---|.*|---|\).*\n\([^|]*\).*|\(.*\)/\2\1\3/'

1) Вы сохраняете исходную строку в буфере удержания с помощью h 2) Вы замените все пробелы точками на s/ /./g 3) Вы добавляете исходную строку из пространства удержания с помощью G 4) Последняя команда s составляет конечную строку из средней части с заменой и первым и последним бит без замены .

1
ответ дан 18 July 2018 в 04:48

Я бы использовал Perl, а не sed:

perl -naF'/\|/' -e '$F[2] =~ tr/ /./; print join "|", @F' -n читает ввод строки за строкой -a, разбивая каждую строку на массив @F F '/\|/', используя вертикальную полосу буква в качестве разделителя при расщеплении $F[2] содержит третий столбец tr - оператор транслитерации, он заменяет пробелы точками в третьем столбце join, соединяет столбцы массива назад (см. join)
0
ответ дан 24 July 2018 в 18:10
  • 1
    Спасибо, но я хочу сделать это только с sed – GoldHaloWings 23 October 2017 в 01:10
  • 2
    Удачи, я предпочитаю использовать правильный инструмент для работы. – choroba 23 October 2017 в 01:11

Попробуйте выполнить эту команду sed:

sed 's/\s/./g;s/432./432 /;s/!|---|./!|---| /' source.txt

И, конечно, вы можете сделать substitution на месте с помощью sed -i или отправить его в другой файл с помощью sed ... > output.txt

g: глобальная опция

1
ответ дан 24 July 2018 в 18:10
  • 1
    Вместо того, чтобы ссылаться на другой экземпляр sed, вам лучше сделать все в одном скрипте: sed 's/\s/./g;s/\./ /;s/!|---|./!|---| /' source.txt. Использование опции -i в любом случае не будет работать с трубопроводом. И при изменении первого пробела вам не нужно ограничивать его числом 432. И опция g является излишней для второй и третьей s команды. – Philippos 23 October 2017 в 11:31
  • 2
    Отмечено и спасибо за обновление! – George Udosen 23 October 2017 в 12:00
  • 3
    Спасибо, что вы работаете, но не будете делать это для моего уравнения sed и его моей ошибки, так как я точно не объяснил. – GoldHaloWings 23 October 2017 в 21:41

Если вы хотите изменить все пробелы между двумя вхождениями |---| с точками, используйте

sed 'h;s/ /./g;G;s/.*\(|---|.*|---|\).*\n\([^|]*\).*|\(.*\)/\2\1\3/'

1) Вы сохраняете исходную строку в буфере удержания с помощью h 2) Вы замените все пробелы точками на s/ /./g 3) Вы добавляете исходную строку из пространства удержания с помощью G 4) Последняя команда s составляет конечную строку из средней части с заменой и первым и последним бит без замены .

1
ответ дан 24 July 2018 в 18:10
  • 1
    Я удивлен, потому что я знаю только основы SED, спасибо, но не буду делать это для моего уравнения sed и его моей вины, так как я не объяснил, что именно моя настоящая проблема PLS взглянуть на мою фактическую проблему, которая дает мне головную боль для поиска дней для "Как нежелательные буквы могут быть удалены из документа с помощью SED? & quot; – GoldHaloWings 24 October 2017 в 03:03

Другие вопросы по тегам:

Похожие вопросы: