sed/bash에서 왼쪽 및 오른쪽 대괄호가 다르게 처리됨

sed/bash에서 왼쪽 및 오른쪽 대괄호가 다르게 처리됨

다음 내용이 포함된 파일이 있습니다.

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

나는 이것을 내 Python 스크립트에서 사용할 목록으로 사용하고 싶기 때문에 and AAA'로 변경 하려고 하며 with 및 with를 사용 하고 대체할 것이라고 생각했습니다 .'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]#

효과가 있었고 ]']. 따라서 AAAsed의 오른쪽 대괄호와 작은따옴표를 왼쪽 대괄호로 바꾸고 다음을 시도해야 합니다.

[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 + 쉘 스크립트를 작성하는 중입니다. 내 질문은 오른쪽 및 왼쪽 대괄호가 sed또는 에 의해 다르게 처리되는지 여부입니다 bash.

sed 버전은 GNU sed 버전 4.2.1입니다.

추신: 안전한 플레이를 위해 두 괄호와 함께 이스케이프 문자를 사용하기로 결정했지만, 내가 있을 장소에서 (가독성을 위해) 이스케이프 문자를 사용하지 않아도 스크립트가 손상되지 않는다는 것을 절대적으로 확신하고 싶습니다. 오른쪽 대괄호로만 작업]

답변1

[소개합니다캐릭터 클래스그리고 ]그것을 닫습니다.

sed가 닫는 명령만 본다면 ]괜찮을 것입니다. sed는 이것이 특별한 명령이 아니라고 가정합니다.

[(닫는 문자 없이 ])을 사용하면 혼란스럽기 sed때문에 이스케이프해야 합니다.

참고로, 그럴 필요는 없습니다.

  • g(전역) 플래그(한 줄에 하나의 대체만 가능)
  • [대신 탈출 .

나는 당신의 변경 사항을 다음과 같이 관리했습니다.

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

답변2

Archemar는 이것이 실패한 이유를 설명했습니다 [. 여기에 이 ​​특별한 대체 방법을 만드는 또 다른 방법이 있습니다.

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

또는 &"방금 일치한 항목"을 의미하는 사용:

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

관련 정보