텍스트 파일의 같은 줄에 있는 문자열 뒤에 문자열을 추가합니다.

텍스트 파일의 같은 줄에 있는 문자열 뒤에 문자열을 추가합니다.

텍스트 파일의 같은 줄에 문자열을 추가하려고 했습니다. 나는 다음 방법을 사용했다.

sed -i "s/\bmembers\b/& \t$host,/" printer.cfg

멤버 문자열 뒤에 문자열을 추가하고 올바르게 만들기 위해 탭 문자도 추가합니다.

나는 다음과 같은 결과를 얻을 것이다.

define hostgroup{
hostgroup_name  HOSTGROUP ONE   
alias       Host Group 1 Printers
members     foo0, foo1, bar2, foo2, bar3
}

여기서 foo0은 위에서 sed를 사용하여 추가한 문자열입니다.

그러나 문제는 많은 "구성원" 문자열을 포함하는 텍스트 파일이 있다는 것입니다.

예를 들어

define hostgroup{
hostgroup_name  HOSTGROUP ONE   
alias       Host Group 1 Printers
members     foo1, bar2, foo2, bar3
}

define hostgroup{
hostgroup_name  HOSTGROUP TWO
alias       2nd Host Group
members     example1, example3, example2
}

위의 예에서는 첫 번째 세그먼트(호스트 그룹 이름 HOSTGROUP ONE)에만 문자열을 추가하려고 합니다. 이 경우 탭을 사용하여 호스트 그룹 이름을 참조하고 "구성원" 문자열 뒤에 텍스트를 추가하려면 어떻게 해야 합니까?

답변1

두 가지 방법:

sed방법:

sed "0,/members/{s/\bmembers */&$host, /}" printer.cfg
  • 0,/members/members- 주소 범위는 첫 번째 줄부터 시작하여 첫 번째 패턴 발생까지 일련의 줄을 차지합니다.

방법:

awk -v h=$host '!f && /members /{ $2=sprintf("%8s, %s",h,$2); f=1 }1' printer.cfg

출력(두 방법 모두):

define hostgroup{
hostgroup_name  HOSTGROUP ONE   
alias       Host Group 1 Printers
members     foo0, foo1, bar2, foo2, bar3
}

define hostgroup{
hostgroup_name  HOSTGROUP TWO
alias       2nd Host Group
members     example1, example3, example2
}

답변2

관심 있는 데이터 범위를 선택, 저장 및 형성하려면 3단계를 따르세요. 표준 출력으로 인쇄하는 마지막 작업은 자동 작업입니다 sed.

host='Foo_0';
sed -Ee '

   # Step-1: SELECT RANGE
   /^define hostgroup[{]/,/^[}]/!b

   # Step-2: SAVE RANGE DATA
   H; /^define hostgroup[{]/h; /^[}]/!d

   # Step-3: SHAPE RANGE DATA
   g;/\nhostgroup_name\s+HOSTGROUP ONE/s/\nmembers\s+/&'"${host}"', /

' printer.cfg

관련 정보