파일에 제공된 텍스트는 다음과 같습니다.
oldValue
=null*
persistedObjectId
="STRAN-2019-10420"*
persistedObjectVersion
=0*
propertyName
="Status"*
uri
="/oms/salesOrder/saveSalesOrder"
"*"와 "=" 사이의 모든 항목을 어떻게 바꿀 수 있나요(반대 대신)? 사용 시도가 실패했습니다.
sed 's/\*\n.*\n=//g' filename.txt
답변1
문제는 sed
한 줄씩 작동하므로 여러 줄 패턴이 일치하지 않는다는 것입니다. GNU를 사용하는 경우 sed
옵션을 사용하여 -z
동일한 버퍼의 모든 라인을 처리할 수 있습니다.
sed -z 's/\*[^=]*=//g' filename.txt
코드도 변경했습니다. 욕심이 많기 때문에 *
사용 시 마지막 줄까지 모든 줄을 먹어치워서 다음 줄에서 멈추도록 변경했습니다.=
.*
[^=]*
=
options 가 없으면 -z
전체 파일을 직접 버퍼에 수집해야 합니다. 나는 보통 예약된 공간에 있는 모든 것을 수집하고 마지막 줄의 예약된 공간과 패턴 공간을 바꿉니다.
sed 'H;1h;$!d;x;s/\*[^=]*=//g'
H
예약된 공간에 각 행을 추가합니다.1h
파일 시작 부분에 개행 문자를 추가하지 않으려면 예약된 공간을 현재 줄로 덮어씁니다.$!d
마지막 행을 제외한 모든 행을 삭제하고 해당 행의 추가 처리를 중지합니다.x
다음은 마지막 라인에 대해서만 실행되어 두 공간을 교환하므로 예약된 공간에 모인 전체 파일이 이제 패턴 공간에 있게 됩니다.