bash найти и заменить - sed awk - PullRequest
       43

bash найти и заменить - sed awk

0 голосов
/ 05 октября 2019

Я пытаюсь очистить текстовый файл с более чем 120000 строками с помощью bash-скрипта. Мне нужно выполнить несколько операций поиска и замены. Порядок каждой операции поиска и замены важен, и файл должен «запомнить» предыдущую функцию поиска и замены.

пример: заменить все '.' (Точка) на '. \ N' (точка и новая строка), затем

заменить все '?' (Знаки вопроса) на '? \ N'(вопросительный знак и новая строка), затем

замените все "!" (точка) на "! \ n" (восклицательный знак и новая строка), затем ... и т. д.

IЯ делаю это, но это не работает:

#!/usr/bin/env bash

sed 's/./.\n/g'
sed 's/?/?\n/g'
sed 's/!/!\n/g'
input.txt

Что я делаю не так?

Является ли sed или awk лучше для того, чего я пытаюсь достичь?

1 Ответ

3 голосов
/ 06 октября 2019

Вы всегда можете передать sed команды, но в этом случае имеет смысл объединить все условия в одну команду:

sed 's/[.!?]/&\n/g' file > newfile

[.!?] соответствует ., ! или? и & в шаблоне замены помещает значение соответствия обратно в строку (новая строка добавляется сразу после этого значения).

См. онлайн-демонстрацию :

s="This is a text. Want more? Yes! End"
sed 's/[.!?]/&\n/g' <<< "$s"

Вывод:

This is a text.
 Want more?
 Yes!
 End

Если вам нужно избавиться от пробелов после ?, ! и ., используйте

sed 's/\([.!?]\)[[:space:]]*/\1\n/g' file > newfile

См. еще sed демо . Здесь:

  • \([.!?]\) - Группа захвата 1: совпадения ., ! или ?
  • [[:space:]]* - 0 или более пробелов

\1 в шаблоне замены относится к значению, захваченному в Группу 1.

...