![sed/bash는 왼쪽과 오른쪽 대괄호를 다르게 처리합니다.](https://linux55.com/image/59684/sed%2Fbash%EB%8A%94%20%EC%99%BC%EC%AA%BD%EA%B3%BC%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EB%8C%80%EA%B4%84%ED%98%B8%EB%A5%BC%20%EB%8B%A4%EB%A5%B4%EA%B2%8C%20%EC%B2%98%EB%A6%AC%ED%95%A9%EB%8B%88%EB%8B%A4..png)
다음 내용이 포함된 파일이 있습니다.
[root@server list]# cat filenames.txt
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB]
[root@qa4app01 list]#
저는 이것을 Python 스크립트의 목록으로 사용하고 싶어서 and AAA'
로 변경해 보았고 and 를 and 로 대체할 것이라고 생각했습니다 .'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
[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']
또는 &
which를 사용하여 "방금 일치한 항목"을 의미합니다.
$ sed "s/^./&'/;s/.$/'&/" file
['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB']