Как правильно определить и заменить апостроф (') на sed? - PullRequest
1 голос
/ 07 октября 2019

У меня есть каталог со многими файлами, имеющими специальные символы и пробелы. Я хочу выполнить операцию со всеми этими файлами, поэтому я пытаюсь сохранить все имена файлов в list.txt и затем выполнить команду с этим списком.

Специальные символы в моем списке & []'.

Поэтому я хочу использовать sed для замены каждого вхождения на \ + соответствующий символ.

Например: filename .txt => filename\ .txt и т. Д.

Дело в том, что у меня проблемы с обработкой апострофов.

Вот моя команда на данный момент:

 ls | sed 's/\ /\\ /g' | sed 's/\&/\\&/g' | sed "s/\'/\\'/g" | sed 's/\[/\\[/g' | sed 's/\]/\\]/g'

Сначала у меня были проблемы с, я полагаю, апострофами вСтроковая команда находится в конфликте с апострофами, окружающими строку. Поэтому вместо этого я использовал двойные кавычки, но они все равно не работают.

Я пробовал все это, но ничего не получалось:

sed "s/\'/\\'/g" (без апострофа) * ​​1025 *

sed "s/'/\'/g" (без экранирования)

sed "s/'/\\'/g" (без обратной косой черты)

sed 's/"'"/\"'"/g' (двойные кавычки в одинарных кавычках)

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

PS: Я видел эту ветку, но у меня не получилось ответить:

https://unix.stackexchange.com/questions/157076/how-to-remove-the-apostrophe-and-delete-the-space

Как заменить апострофом внутри файла с помощью SED

Ответы [ 4 ]

2 голосов
/ 07 октября 2019

Это может сделать:

cat file
avbadf
test&rr
more [ yes
this ]
and'df


sed -r 's/(\x27|&|\[|\])/\\\1/g' file
avbadf
test\&rr
more \[ yes
this \]
and\'df
  • \x27 равно одинарной кавычке '
  • \x22 равно двойной кавычке "
1 голос
/ 07 октября 2019

Пожалуйста, попробуйте следующее:

sed 's/[][ &'\'']/\\&/g' file

Используя тот же пример @Jotne, результат будет:

gavbadf
gtest\&rr
gmore\ \[\ yes
gthis\ \]
gand\'df

[Как это работает]

  • Часть regex в приведенной выше команде sed s просто определяет класс символов & []', который должен быть экранирован обратной косой чертой.
  • правая квадратная скобка ] не нуждается в экранировании при установке сразу после левой квадратной скобки [.
  • Запутывающей частью будет обработка одной кавычки. Мы не можем поместить одинарную кавычку в одинарные кавычки, даже если избежим ее. Обходной путь следующий: скажем, у нас есть задание str='aaabbb'. Чтобы поставить одинарную кавычку между "aaa" и "bbb", мы можем сказать как str='aaa'\''bbb'. Это может выглядеть странно, но объединяет три последовательности;1) закрыть строку в одинарных кавычках как 'aaa'. 2) поставить одинарную кавычку с обратной косой чертой как \'. 3) перезапустить строку в одинарных кавычках как 'bbb'.

Надеюсь, это поможет.

1 голос
/ 07 октября 2019

Я думаю, что все ваши спички на самом деле нуждаются в этом шаблоне замены. Кажется, что этот работает для всех примеров:

ls | sed "s/\ /\\\ /g" | sed "s/\&/\\\&/g" | sed "s/\[/\\\[/g" | sed "s/\]/\\\]/g" | sed "s/'/\\\'/g"

Так что s / regex / replace / command и 'regex' и 'replace' имеют разные наборы специальных символов.

отличается только один - s/'/\\\'/g и только потому, что я не верю, что в выражении регулярного выражения есть какой-либо специальный символ. В выражении замены есть какой-то непонятный специальный символ для сопоставления концов буфера в многострочном режиме в соответствии с документами. Возможно, поэтому ему требуется экранирование на стороне замены, но не на стороне регулярного выражения.

Например, \ 5 - это специальный символ в выражении замены, поэтому для замены:

filename5.txt -> filename\5.txt

Вам также понадобится, как и в случае с апострофом:

sed "s/5/\\\5/g"

Это, вероятно, связано с таинственными внутренними работами разбора sed, оно может читаться справа налево или что-то в этом роде.

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

Упс, я нашел ответ на свой вопрос. Вот рабочий ввод:

sed "s/'/\\\'/g"

Это эффективно заменит любую ' на \'.

Однако у меня возникают проблемы с пониманием, что именно происходитВот.

Так что, если я правильно понимаю, мы избегаем обратной косой черты и апостроф в строке замены. Теперь, если бы кто-нибудь мог ответить на некоторые из них, я был бы признателен:

  • Почему бы нам не уйти от первой кавычки (той, что в шаблоне для поиска)?
  • Почему мы должны избегать обратной косой черты, тогда как для других символов в этом нет необходимости?
  • Почему нам нужно экранировать вторую кавычку (ту, что в строке замены)?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...