![일치하는 줄에서 [를 \[로 바꾸는 방법은 무엇입니까?](https://linux55.com/image/120222/%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%EC%A4%84%EC%97%90%EC%84%9C%20%5B%EB%A5%BC%20%5C%5B%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
여러 줄에서 [
로 바꾸려면 어떻게 해야 합니까 \[
? 한 줄에 여러 번 가능하지만 로 시작하는 줄에서만 가능합니까 ABCD
?
답변1
존재하다 sed
:
sed '/^ABCD/ s/\[/\\[/g' filename
표현식은 주소 다음에 명령이 오는 것입니다. 주소 는 해당 행이 정규식(으로 시작하는 행)과 일치하는 경우에만 /^ABCD/
명령이 실행됨을 나타냅니다.^ABCD
ABCD
명령 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
암시적 루핑과 자동 인쇄를 가정할 수 있습니다. 행 sed
이 ABCD
.
우리는 이것을 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