일치하는 줄에서 [를 \[로 바꾸는 방법은 무엇입니까?

일치하는 줄에서 [를 \[로 바꾸는 방법은 무엇입니까?

여러 줄에서 [로 바꾸려면 어떻게 해야 합니까 \[? 한 줄에 여러 번 가능하지만 로 시작하는 줄에서만 가능합니까 ABCD?

답변1

존재하다 sed:

sed '/^ABCD/ s/\[/\\[/g' filename

표현식은 주소 다음에 명령이 오는 것입니다. 주소 는 해당 행이 정규식(으로 시작하는 행)과 일치하는 경우에만 /^ABCD/명령이 실행됨을 나타냅니다.^ABCDABCD

명령 s/\[/\\[/g은 모든 항목 [\[. 일반적으로 이 명령의 형식은 입니다 s/foo/bar/. 이는 정규식을 foo로 바꾸는 것을 의미합니다 bar. 마지막 것은 g한 줄에 여러 번 일치하도록 만들고 및 [및 둘 다 정규 표현식에 특수 기능을 갖고 있으므로 -- for literals 및 for literals \명령에서 이스케이프됩니다 .\[[\\[\[

답변2

어쩌면 이것이 맞을 수도 있습니다:

perl -nle 'if ( /^ABCD/) { $_ =~ s/\[/\\[/g;};print'

(펄 초보자는 여기...)

답변3

다음과 같은 파일을 입력했다고 가정해 보겠습니다.

$ cat input.txt
ABCD this line [ starts with [ abcd
this one doesn't
ABCD but this [ one does

귀하의 질문이 Perl로 태그되어 있으므로 다음 중 하나를 확인하세요.

$ perl -pe '/^ABCD/ and s/\[/\\[/g' input.txt                                                         
ABCD this line \[ starts with \[ abcd
this one doesn
ABCD but this \[ one does

-p암시적 루핑과 자동 인쇄를 가정할 수 있습니다. 행 sedABCD.


우리는 이것을 awk에서 할 수 있습니다:

$ awk '/^ABCD/{gsub(/\[/,"\\[")};1' input.txt                                                         
ABCD this line \[ starts with \[ abcd
this one doesn't
ABCD but this \[ one does

이는 매우 간단한 방식으로 작동합니다. - 줄이 로 시작하면 ABCD교체 gsub()가 이루어집니다. - awk 코드는 evaluation { actions}구조에서 작동하므로 1모든 줄에서 "true"를 강제로 평가하고 { actions}해당 부분을 생략하면 기본적으로 인쇄됩니다. 수행하지 않고 작업을 더 짧게 만드는 약간의 트릭입니다.{print}


왜 안 되겠습니까? 여기 Python이 있습니다.

$ python -c 'import sys; print "\n".join([i.strip().replace("[","\[") if i.startswith("ABCD") else i.strip() for i in sys.stdin ])' < input.txt                                                                                 
ABCD this line \[ starts with \[ abcd
this one doesn't
ABCD but this \[ one does

이는 매우 간단한 방식으로도 작동합니다.

  • 쉘 연산자를 사용하여 텍스트를 Python stdin스트림 으로 리디렉션합니다 <.
  • 모든 행은 구조 내에서 읽고 처리됩니다 [ item for item in iterable]. 이를 목록 이해라고 합니다. 기본적으로 모든 행의 목록을 작성합니다.
  • i.strip().replace("[","\[") if i.startswith("ABCD") else i.strip()매우 간단합니다. 줄이 "ABCD"로 시작하면 후행 줄 바꿈을 자릅니다. 모두 [로 바꾸고 \[, 그렇지 않으면 원래 줄을 삭제합니다.
  • 모든 줄을 목록으로 읽어들인 후에는 줄 목록이 개행으로 구분된 문자열로 다시 연결되어 인쇄됩니다.

스크립트 형식에서는 다음과 같습니다.

#!/usr/bin/env python
import sys
with open(sys.argv[1]) as fd: 
    for i in fd:
        print i.strip().replace("[","\[") if i.startswith("ABCD") else i.strip()

다음과 같이 작동합니다.

$ ./add_slash.py input.txt                                                             
ABCD this line \[ starts with \[ abcd
this one doesn
ABCD but this \[ one does

관련 정보