텍스트 파일의 같은 줄에 문자열을 추가하려고 했습니다. 나는 다음 방법을 사용했다.
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