Левые и правые квадратные скобки обрабатываются по-разному в sed/bash

Левые и правые квадратные скобки обрабатываются по-разному в sed/bash

У меня есть файл со следующим содержимым:

[root@server list]# cat filenames.txt
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB]
[root@qa4app01 list]#

Я хочу использовать это в качестве списка в своем скрипте Python, поэтому я пытаюсь изменить AAA'на 'AAA'и 'BBBна 'BBB'и я подумал, что буду использовать sedи заменять [на ['и ]на '].

Для подтверждения я попробовал это:

[root@server list]# cat filenames.txt | sed "s/]/']/g"
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','MENSCOGH','TESTENT','DORASINE','LOKAWINK','BBB']
[root@server list]#

Это сработало, и я смог заменить ]на ']. Так что, AAAмне просто нужно заменить правые квадратные скобки и одинарную кавычку в sed на левую квадратную скобку и попробовать это:

[root@server list]# cat filenames.txt | sed -e "s/]/']/g" -e "s/[/['/g"
sed: -e expression #2, char 8: unterminated `s' command
[root@server list]#

Ладно. Я думал, что по какой-то причине sedкоманды добавления работают неправильно, и чтобы проверить это, я попробовал sedотдельно левую квадратную скобку:

[root@server list]# cat filenames.txt | sed  "s/[/['/g"
sed: -e expression #1, char 8: unterminated `s' command
[root@server list]#

Странно. Похоже, что sedон обрабатывает левые и квадратные скобки по-разному. Мне удалось обойтись без экранирования [, в то время как sedотказывается работать ]без экранирующего символа. В конце концов я получил то, что хотел, добавив экранирующие символы к левой квадратной скобке, как показано ниже:

[root@server list]# cat filenames.txt | sed -e "s/]/']/g" -e "s/\[/\['/g" ['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','MENSCOGH','TESTENT','DORASINE','LOKAWINK','BBB'] [root@server list]#

Я в процессе написания скрипта python + shell, который будет обрабатывать файлы с многочисленными экземплярами квадратных скобок. Мой вопрос в том, обрабатываются ли правые и левые квадратные скобки по-разному с помощью sedor bash.

Версия sed — это GNU sed версии 4.2.1.

PS: Я решил использовать экранирующие символы с обеими скобками, чтобы перестраховаться, но хочу быть абсолютно уверенным, что это не сломает скрипт, если я не буду использовать экранирующий символ (из соображений читабельности) в местах, где я буду работать только с правой квадратной скобкой.]

решение1

[представляеткласс персонажаи ]закрывает его.

Если sed видит только ](т. е. закрывающую команду), то все в порядке, sed предполагает, что это не специальная команда.

Использование только [(без закрывающего ]) сбивает с толку sed, поэтому его необходимо экранировать.

Кстати, нет необходимости

  • g(глобальный) флаг (только одна замена в строке)
  • побег [взамен.

Я справился с вашим изменением с

sed -e "s/]/']/" -e "s/\[/['/" 

решение2

Архемар объяснил, почему это не удалось [, вот еще один способ сделать эту конкретную замену:

$ sed "s/^./['/;s/.$/']/" file
['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB']

Или, используя &which, можно сказать «то, что вы только что сопоставили»:

$ sed "s/^./&'/;s/.$/'&/" file
['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB']

Связанный контент