다음 텍스트 파일이 있다고 가정하십시오.
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.5.213 c04c0.ac
10.0.5.213 c04c1.ac
10.0.5.213 c04c2.ac
10.0.5.213 c04c3.ac
10.0.5.213 c04c4.ac
10.0.5.213 c04c5.ac
10.0.5.213 c04c6.ac
10.0.5.213 c04c7.ac
10.0.5.213 c04c8.ac
....
이걸 어떻게 바꾸시겠어요?
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.5.213 c04c0.ac c04c0
10.0.5.213 c04c1.ac c04c1
10.0.5.213 c04c2.ac c04c2
10.0.5.213 c04c3.ac c04c3
10.0.5.213 c04c4.ac c04c4
10.0.5.213 c04c5.ac c04c5
10.0.5.213 c04c6.ac c04c6
10.0.5.213 c04c7.ac c04c7
10.0.5.213 c04c8.ac c04c8
....
호스트 이름에서 ".ac"를 제거했습니다. 하지만 왜 "localhost"가 정규식에 의해 제거되지 않는지 잘 모르겠습니다. c04cx만 수집하여 줄 끝에 추가하도록 정규식을 수정하려면 어떻게 해야 합니까?
cat /etc/hosts | awk '{print $2}'| sed -r 's/(c04c)([0-9]+)(.*)/\1\2/'
localhost
localhost
c04c0
c04c1
c04c2
c04c3
c04c4
c04c5
c04c6
c04c7
c04c8
답변1
두 개의 열(IP 주소를 포함하는 열과 이름으로 끝나는 열)을 포함하는 행만 수정하려면 .ac
이것과 이것만 일치하는 정규식을 사용하십시오. 정규식이 주석 처리된 줄과 일치하지 않는지 확인하는 것이 좋습니다.
sed -e 's/^\([\t ]*\)\([0-9a-fA-F.:][0-9a-fA-F.:]*\)\([\t ][\t ]*\)\([^\t ][^\t ]*\)\.ac\([\t ]*\)/\1\2\3\4.ac \4/'
111111 222222222222222222222222222 33333333333 4444444444444 555555
- 들여 쓰기
- IP 주소(IPv4 또는 IPv6)
- 기둥을 구분하는 공간
- 호스트 이름( 제외
.ac
) - 후행 공백
답변2
에서 이 작업을 쉽게 수행할 수 있습니다 awk
. 명령의 문제점은 awk
및 를 모두 사용하고 있다는 것입니다 sed
. 대부분의 awk
.
다음 예에서는 두 번째 열만 정규식과 일치시키고 새 데이터를 추가하여 전체 행을 인쇄합니다.
awk '{ if ( match($2, /(c04c[0-9]+)[.]ac/, arr) ) {
print $0" "arr[1];
} else {
print;
}' < /etc/hosts > newfile
답변3
sed 's/[[:blank:]]\(c04c[0-9]\{1,\}\).*/& \1/'