패턴과 일치하고 그 뒤에 오는 첫 번째 문자열 인스턴스를 바꿉니다(공백이나 탭에 관계없이).

패턴과 일치하고 그 뒤에 오는 첫 번째 문자열 인스턴스를 바꿉니다(공백이나 탭에 관계없이).

얼마 전에 비슷한 질문을 했지만 제대로 작동하지 않는 데 어려움을 겪고 있습니다.

다음과 같이 구성 파일 수정을 위한 스크립트를 작성하고 있습니다.

[Thing1]
    [[subthingA]]
        this = 0
        that = string
        and = localhost
        the = 80
        other = 0
        thing_ading = /path/to/a/dir

[Thing2]
    [[subthingB]]
        this = 0
        thing_ading = /path/to/dir
        here = 0

여기에는 N개의 [사물]이 있으며 일반적으로 동일한 키 및/또는 키/값 쌍의 값이 있으며 [[하위 항목]] 아래의 키/값 쌍은 정확히 8칸 들여쓰기되어 있습니다. 나는 특히 thing_ading아래의 값을 SubthingB다른 디렉토리 경로로 변경하는 awk/sed/grep/tr/cut/perl을 사용하여 한 줄짜리 코드를 만들려고 노력하고 있습니다 .

모든 것을 편집할 수 thing_adings있고 특정 쌍을 타겟팅할 수 있지만 공백으로 인해 문제가 발생합니다.

답변1

sed이러한 문제를 해결하기 위해 범위 연산자를 사용할 수 있습니다 ,.

sed -e '
   /^\[Thing2]$/,/^$/!b
   /^[[:blank:]]\{4\}\[\[subthingB]]/,/^$/s|^\([[:blank:]]\{8\}thing_ading\) = .*|\1 = /YOUR/NEW/PATH/TO/DIR|
' yourinifile
  • 먼저 잘못된 범위를 건너뛰고 올바른 범위를 선택합니다.
  • 그런 다음 적절한 범위에 있을 때 원하는 thing_ding 변수에 대해 대체를 수행할 수 있습니다.

답변2

이것은 sed문장입니다:

sed '/[[subthingB]]/,/^ *\[/{/thing_ading =/s_=.*_= /your/path/_}' config_file

블록 만 작업하려면 subthingB들여쓰기 이후부터 다음 줄까지 [[subthingB]]모두 처리합니다.[

이제 이 블록의 경우 백슬래시 교체로 인해 읽을 수 없게 되는 것을 방지하기 위해 대신 명령 구분 기호를 사용 thing_ading하여 행의 주소를 지정하고 교체를 수행합니다 ._/s

subthingB블록에 항목이 있는 것이 보장 되면 thing_ading다음과 같이 단순화할 수 있습니다.

sed '/[[subthingB]]/,/thing_ading =/{//s_=.*_= /your/path/_}'

내부 주소 지정을 위해 마지막 패턴을 재사용합니다.

관련 정보