파일의 한 문자열을 다른 문자열로 바꾸기

파일의 한 문자열을 다른 문자열로 바꾸기

다음과 같은 구성 파일이 많이 있습니다.

reader_0 = newcamd({
name = "Oct 1",
host = "hostname 1",
port = 27020,
user = "UNAME",
pass = "password1",
key  = "0102030405060708091011121314",
})

reader_1 = newcamd({
name = "Oct 2",
host = "hostname 2",
port = 27020,
user = "UNAME",
pass = "password2",
key  = "0102030405060708091011121314",
})

포트 번호 27020을 "reader_1" 섹션의 다른 포트 번호(예: 22443)로 바꾸는 방법sed?

감사해요.

답변1

sed의 전신인 ed를 사용하세요.

ed -s input <<< $'/^reader_1 =\n/^port =\nc\nport = 22443,\n.\nw\nq'

ed그러면 파일을 편집하기 위해 ANSI 인용 명령 문자열이 전송됩니다 . 명령은 다음과 같습니다:

  1. /^reader_1 =-- "reader_1="로 시작하는 줄 검색
  2. /^port =-- 거기에서 "port="로 시작하는 줄을 앞으로 검색합니다.
  3. c-- 이 줄을 바꾸세요
  4. port = 22443,-- 본문으로 이동
  5. .-- 대체 텍스트 끝
  6. w--디스크에 파일 쓰기
  7. q- 사직하다ed

실제 데이터를 기반으로 어느 정도 신중하게 일치하도록 정규식을 강화하거나 느슨하게 할 수 있습니다.

답변2

나는 , , 등이 있다고 reader_0가정 합니다 .host = hostanme 1reader_1host = hostname 2

이 명령을 사용하여 다음을 바꿀 수 있습니다 file.

sed -i '/host = "hostname 2",/{N;s/port = 27020,/port = 22443,/}' file

답변3

동일한 파일에 유사한 행이 여러 개 있는 경우 다음을 입력해야 합니다.

sed -i ':a;N;$!ba; s/27020/22443/2' file

어디/2두 번째 게임을 대체한다는 의미입니다.27020. -i 매개변수 없이 sed를 사용하여 이 명령을 테스트하여 어떤 결과가 나오는지 확인할 수 있습니다.

sed -i 's/27020/22443/g' file그렇지 않으면 수정할 파일을 알고 있는 한 간단한 접근 방식이 작동합니다.

답변4

awk상태 머신 스타일 기술을 사용할 수 있다면 더 좋을 수 있습니다.

awk '/^reader_1 = newcamd\({/ { section_found = 1} /})/ { section_found = 0 } section_found && /port = 27020,$/ { sub(/27020,$/, "22443,") } { print }' file1 > file2 && mv file2 file1

설명하다:

섹션 시작이 발견되면 플래그를 설정합니다.

/^reader_1 = newcamd\({/ {
    section_found = 1
}

섹션의 끝이 발견되면 플래그를 지웁니다.

/})/ {
    section_found = 0
}

오른쪽 섹션과 오른쪽 행에서 새 포트 번호를 바꿉니다.

section_found && /port = 27020,$/ {
    sub(/27020,$/, "22443,")
}

모든 줄을 인쇄합니다.

{
    print
}

출력을 file2(임시 파일)로 보냅니다.

> file2

모두 성공하면 file2의 이름을 file1로 바꿉니다.

&& mv file2 file1

원하는 대로 정규식을 느슨하게 또는 엄격하게 만들 수 있습니다.

sed이러한 유형의 코드는 또는 코드보다 읽고 유지 관리하기가 더 쉽습니다 ed. 특히 형식이 제가 설명하는 방식과 유사한 경우 더욱 그렇습니다.

관련 정보