sed를 사용하여 복잡한 문자열 찾기 및 바꾸기

sed를 사용하여 복잡한 문자열 찾기 및 바꾸기

"xyz.abc.001.xxx.0.820"과 같은 문자열이 포함된 큰 파일이 있는데 전체 파일에서 이를 "0,820,xyz.abc.001.xxx"로 바꾸고 싶습니다.

예:

xyz.abc.001.xxx.0.820\ to 0,820,xyz.abc.001.xxx 
xyz.abc.001.xxx.820.123\ to 820,123,xyz.abc.001.xxx
xyz.abc.001.xxx.1000.2000\ to 1000,2000,xyz.abc.001.xxx 
xyz.abc.001.xxx.1.100\ to 1,100,xyz.abc.001.xxx 

다음 sed 명령과 정규식을 사용하고 있지만 제대로 교체되지 않습니다

sed -E "s/(xyz.abc[0-9]\+\.xxx)\.([0-9]\+)\.([0-9]\+)\\/\2,\3,\1/g" file_name

이것이 가능합니까?

미리 감사드립니다.

답변1

시도 해봐

sed -E "s/(xyz.abc.*xxx).([0-9]+)\.([0-9]+)./\2,\3,\1/" 
sed -E "s/(xyz.abc.*xxx).([0-9]+)\.([0-9]+)\\\\/\2,\3,\1/" 

어디

  • 모드 선택은 다음과 같이 이루어집니다.\( ... \)
  • 후행은 (모든 문자) 또는 (셸에서 탈출하고 sed에서 탈출)로 \캡처할 수 있습니다 ..\\\\
  • 점을 지정하기 위해 .또는 를 사용한다는 점에 유의하세요.\.

답변2

지금은 시도할 수 없지만, 나에게는 그다지 문제가 되지 않는 것 같습니다. \+기준에 맞지 않으니 시도해 보세요.

sed -E "s/(xyz\.abc[0-9]{1,}\.xxx)\.([0-9]{1,})\.([0-9]{1,})\\/\2:\3,\1/g" file_name

답변3

필수 사항이 아닌 경우 다음을 기반으로 sed다음 솔루션을 시도해 볼 수 있습니다 .awk

awk -F. -v OFS="." '{sub(/\\$/,"",$NF); printf("%s,%s,",$NF,$(NF-1)); NF=NF-2}1' input.txt

이는 각 줄을 .- 구분된 필드로 해석하고, 뒤따르는 마지막 줄을 제거하고 \, 출력 줄의 시작 부분에서 쉼표로 구분된 마지막 두 필드를 인쇄한 다음, 나머지 필드(다시 .- 구분됨)를 인쇄합니다.

관련 정보