마지막 인스턴스를 제외하고 문자열의 모든 인스턴스 바꾸기

마지막 인스턴스를 제외하고 문자열의 모든 인스턴스 바꾸기

다음과 같이 구성된 문자열이 있습니다.

XXthisXXisXXjust\nXXa\nXXtest

XX각 문자 앞의 마지막 문자를 다음과 같이 변경하고 싶습니다 .\nYY

$ echo "XXthisXXisXXjust\nXXa\nXXtest"
XXthisXXisXXjust
XXa
XXtest

되어야 한다

$ echo "XXthisXXisXXjust\nXXa\nXXtest" | ???
YYthisYYisXXjust
XXa
XXtest

어떻게 해야 하나요?

편집: 내 원래 질문은 약간XY 문제, 그 점은 사과드립니다. 내 경우에는 색상 코드를 수정해야 했기 때문에 XX실제로는 굵은 파란색 코드 [1;34mYY굵은 회색 코드 가 되었습니다 [1;90m.

[1;34m그런데 같은 줄(마지막 줄 포함)에 3개 이상의 인스턴스를 가질 수 있습니다.

다시 한 번 시간을 낭비했다면 사과드립니다. 이 해결 방법은 제 상황에 쉽게 적용될 수 있을 것 같습니다.

답변1

사용 표준 sed:

$ printf 'XXthisXXisXXjust\nXXa\nXXtest\n' | sed 's/XX/YY/g; s/\(.*\)YY/\1XX/'
YYthisYYisXXjust
XXa
XXtest

코드 sed주석:

s/XX/YY/g;              # change all XX to YY
s/\(.*\)YY/\1XX/;       # replace last YY with XX

YY두 번째 교체는 수정된 줄의 마지막 교체를 대체합니다 . XX이는 .*욕심이 많기 때문입니다.

당신 XX이 만약 [1;34m그렇다면 , YY그렇다면[1;90m

sed 's/\[1;34m/[1;90m/g; s/\(.*\)\[1;90m/\1[1;34m/'

정규 표현식에서 일치시키려는 것처럼 이스케이프 [처리해야 합니다 .\[

답변2

GNU를 사용 sed하고 다음을 수행하십시오 rev.

$ echo "XXthisXXisXXjust\nXXa\nXXtest" | rev | sed 's/XX/YY/2g' | rev
YYthisYYisYYjust\nYYa\nXXtest

$ echo -e "XXthisXXisXXjust\nXXa\nXXtest" | rev | sed 's/XX/YY/2g' | rev
YYthisYYisXXjust
XXa
XXtest

검색을 거꾸로 하고 문자열을 바꿀 필요가 없습니다. 즉 , 이 특별한 경우 XX에는 YY회문이기 때문입니다.

답변3

  1. 먼저 모든 인스턴스를 변경 XX하고 YY.

s/XX/YY/g

  1. 그런 다음 다음 으로 시작하는 \nYY모든 항목을 바꿉니다.\nXX

s/\\nYY/\nXX/g

  1. YY마침내 세 번째 사건을 다음으로 대체했습니다 .XX

s/YY/XX/3

[root@ServerA studyroom]# echo "XXthisXXisXXjust\nXXa\nXXtest" | sed 's/XX/YY/g;s/\\nYY/\nXX/g;s/YY/XX/3'
YYthisYYisXXjust
XXa
XXtest

내 동료 중 한 명이 말했듯이 모든 길은 로마로 통하며 어떤 길은 다른 길보다 빠릅니다.

관련 정보