Sed — 일치하는 줄의 문자를 대체 하시겠습니까?


21

다음과 같은 줄이 포함 된 파일에서 :

# lorem ipsum blah variable

#특정 문자열이 포함 된 동일한 줄에서 문자 를 제거하고 싶습니다 . 가 sed이 좋은?

이 조건부 작업을 수행하기 위해 고심하고 있습니다. 이 작업을 수행하는 "서투른"방법이 있습니다. awkor sed와 일치하는 줄 번호를 찾은 다음이 번호를 별도의 sed명령으로 사용할 수 있지만 훨씬 더 좋은 방법으로 수행 할 수 있다고 생각합니다.

답변:


36

찾고자하는 스트링을 조작 할 라인 선택기로 사용하십시오.

sed '/ipsum/s/#//g'

/ipsum/"ipsum"을 포함하는 행을 선택하고이 행에서만 뒤에 오는 명령이 실행됩니다. 중괄호를 사용하여 더 많은 명령을 실행할 수 있습니다

/ipsum/{s/#//g;s/@/-at-/g;}

4
동의한다; 이것이 가장 좋은 대답입니다 (단 하나는 아니지만). 댓글 : (1) 's/#//g'제거 모든# 라인의 문자를. 원하는 것이 아니라면 g( "글로벌"을 의미) 제거하십시오 . (2) 파일을 제 위치에서 편집하려면 (질문에서 요구 한대로)을 사용하십시오 sed -i.
G-Man, 'Reinstate

2
(3) 실제 상황에서 줄을 주석 해제하려면을 사용 sed -i '/ipsum/s/#[[:space:]]*//'하여 바로 뒤에 공백과 탭을 제거 할 수 있습니다 #. (4) #행에서 첫 번째 공백이 아닌 문자 인지 확인하는 것이 좋습니다. 현재 명령은 #행에서를 삭제합니다 prompt "Enter # of ipsums:".
G-Man, 'Reinstate

1
@ G-Man-훌륭한 추가! 두 번째 pt (리딩 스페이스)는 어떻 sed -i '/ipsum/s/^#[[:space:]]*//'습니까? ( ^줄의 $끝을 의미하는 줄의 시작을 나타냄 )-적어도 말끔하게…
Jeremy Davis

1
@JeremyDavis : 그렇습니다 . 정규식을로 줄의 시작 부분에 고정 시킬 수^ 는 있지만 잘못되었습니다. 필자는 종종 코드 #바로 앞에 코드를 삽입하여 들여 쓰기 된 코드를 주석 처리 하므로 #들여 쓰기됩니다. 내가 그런 유일한 사람인지 의심합니다.
G-Man, 'Reinstate

1
@ G-Man-아, 물론입니다! 고마워, 나는 그것을 고려하지 않았다. 따라서 ^& 사이에 공백이 있는지 확인하고 싶을 #것이므로 다음과 같습니다 /ipsum/{/^[[:space:]]*#/s/#[[:space:]]*//}.. 그럼에도 불구하고, 위치에 따라 #여전히 문제가 발생할 수 있습니다 (예 : 공백 들여 쓰기 / 분리를 사용하는 언어).
Jeremy Davis

7
$ cat input.txt
# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
# lorem ipsum blue variable

그때:

$ sed 's|# \(.*blue.*\)|\1|' input.txt

제공합니다 :

# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
lorem ipsum blue variable

다음과 같이 작동합니다.

s이야기 sed는 정규 표현식 발견 무엇으로 대체해야한다고.

패턴은 # \(.*blue.*\)다음과 같이 분류됩니다. 해시와 공백을 찾습니다. 대괄호 ( \()는 그룹화를 시작합니다. 전후에 무엇인가 .*blue.*있는 단어 blue입니다. 다음 대괄호 ( \))는 그룹을 닫습니다.

대체는 \1첫 번째 그룹화 브래킷의 내용에 대한 역 참조입니다.


3

Ex 모드에서 Vim을 사용할 수 있습니다 :

ex -sc '/ipsum/s/#//|x' file
  1. s 대용품

  2. x 저장하고 닫습니다


꽤 괜찮은데. 나는 그것에 대해 몰랐다! TBH, 나는 이것이이 질문에 대한 최선의 대답인지 확신하지 못합니다 (IMO는 주요 sed 답변이 하나입니다).하지만 여전히 멋집니다! 게시 해 주셔서 감사합니다.
Jeremy Davis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.