
У меня есть файл со следующим содержимым:
[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, который будет обрабатывать файлы с многочисленными экземплярами квадратных скобок. Мой вопрос в том, обрабатываются ли правые и левые квадратные скобки по-разному с помощью sed
or 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']