sed без регексу


0

Я використовую GNU SED для пошуку та заміни функціональності великих файлів (до 2 Гб).

Знайти та замінити символи можуть містити будь-які символи, отже, я хочу, щоб параметри пошуку та заміни розглядалися як звичайний текст у міру появи.

Я не хочу ставитись ні до пошуку, ні заміни параметрів як регулярного вираження командою sed.

Я багато експериментував, але щоразу отримую нові комбінації регулярних виразів, які не працюють для sed як простого тексту.

Як цього можна досягти?

Чи є якась формула, щоб уникнути особливих символів?

Примітка: Я використовую ~оператор як сепаратор команд замість/

Нижче наведено приклад

sed -ne "s~^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$~Replace" -ne "w output.txt" "input.txt"

Вищенаведена команда не працює, оскільки вона трактує параметр find як регулярний вираз (як і регулярний вираз). Отже, щоб знайти текст, я повинен уникати деяких спеціальних символів у регулярному виразі, як показано нижче

sed -ne "s~\^\[-+\]?\[0-9\]\*\\.?\[0-9\]+(\[eE\]\[-+\]?\[0-9\]+)?\$~Replace" -ne "w output.txt" "input.txt"

В іншому прикладі я повинен змінити .*$на " .\*\$ Але в", (.*$) я не хочу мофікувати вхід.

Так чи є якесь універсальне правило для послідовності втечі?


Чи можете ви бути більш конкретними? Наприклад, введення зразка та очікуваний вихід.
Тор

Використовуйте одинарні лапки замість подвійних лапок, тоді оболонка залишить ці символи в спокої.
Тор

але він видає наступну помилку sed: -e вираз №1, char 1: невідома команда: `` '
sagar

Вам не вистачає припинення ~. Яка версія sed це?
Тор

sed -ne 's ~ ad ~ sss ~ g' -ne 'w output.txt' 'input.txt' Це моя команда, яка дає помилку. І версія sed => GNU sed версія 4.2.1
sagar

Відповіді:


1

З: Чи є якась формула, щоб уникнути особливих символів?
З: Чи є якесь універсальне правило для послідовності втечі?

A: Ви можете використовувати відповідний шістнадцятковий код для спеціальних символів, в тих випадках , коли просто набравши /, ., *, ?, $і т.д. стає дратівливим. Наприклад:

sed -rn '/\x22/p' file

буде друкувати рядки, що містять подвійні лапки, оскільки \x22представляє ".

Якщо вам потрібно шукати шістнадцяткові коди, ви можете зручно зберегти їх у файл із цією командою:

gawk 'BEGIN{for(i=0;i<255;i++){printf("%d\t%x\t%c\n", i,i,i)}}' null >chars.txt

1
Це, здається, безпосередньо відповідає на два чіткі питання, які задає ОП.
simlev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.