sed를 사용하여 대체 문자열의 내용을 보존하는 방법

sed를 사용하여 대체 문자열의 내용을 보존하는 방법

sed발견된 텍스트를 그대로 유지하고 끝에 콜론을 추가하여 텍스트 줄을 이것으로 바꾸려고 합니다 .

특히 파일에 이 형식의 줄이 많이 있습니다.

CWMPVendorXEventCodeCutOff              20
CWMP<othertitle>              20

이 형식으로 변경하고 싶습니다.

CWMPVendorXEventCodeCutOff:              20
CWMP<othertitle>:                        20

나는 지금 여기 있다

sed 's_CWMP.*?\\s_CWMP.*?:_g'

그러나 이것은 분명히 작동하지 않습니다. 어떻게 해야 하나요?

답변1

sed 's/\<CWMP[^[:blank:]]*/&:/' file

대체 부분은 &대체된 정규식 부분과 일치하는 문자열로 대체됩니다. CWMP공백이 아닌 문자가 뒤에 오는 것과 일치합니다 . 시작 부분의 패턴은 \<문자열이 CWMP단어의 맨 처음 부분에 나타나는지 확인합니다(즉, 다른 곳의 하위 문자열로 표시되지 않음).

사용

sed 's/^CWMP[^[:blank:]]*/&:/' file

줄의 시작 부분에서 강제로 일치시켜야 하는 경우.


어떤 경우에는 다음을 사용할 수도 있습니다.

awk '$1 ~ /^CWMP/ { $1 = $1 ":"; print }' file

이는 줄에서 공백으로 구분된 첫 번째 단어를 일치시킨 ^CWMP다음 :해당 단어 끝에 a를 추가한다고 가정합니다. 그러나 이는 다음 줄의 두 필드 사이의 모든 공백을 "먹고" 단일 공백으로 대체합니다.

$ awk '$1 ~ /^CWMP/ { $1 = $1 ":"; print }' file
CWMPVendorXEventCodeCutOff: 20

$1 ~각 줄의 시작 부분을 일치시키려면, 즉 줄에 초기 들여쓰기가 포함되어 있지 않은 경우 이를 제거하십시오.

답변2

sed -e 's/\(CWMPVendorXEventCodeCutOff\)/\1:/'

작동해야합니다.

답변3

다음 awk 명령을 사용하여 테스트하면 잘 작동합니다.

주문하다

awk '{$1=$1":";printf  "%s%30s\n",$1,$2}' filename| sed -r "s/\s+/ /g"

산출

awk '{$1=$1":";printf  "%s%30s\n",$1,$2}' y.txt | sed -r "s/\s+/ /g"

CWMPVendorXEventCodeCutOff: 20
CWMP<othertitle>: 20

관련 정보