다음과 같이 구성된 문자열이 있습니다.
XXthisXXisXXjust\nXXa\nXXtest
XX
각 문자 앞의 마지막 문자를 다음과 같이 변경하고 싶습니다 .\n
YY
$ echo "XXthisXXisXXjust\nXXa\nXXtest"
XXthisXXisXXjust
XXa
XXtest
되어야 한다
$ echo "XXthisXXisXXjust\nXXa\nXXtest" | ???
YYthisYYisXXjust
XXa
XXtest
어떻게 해야 하나요?
편집: 내 원래 질문은 약간XY 문제, 그 점은 사과드립니다. 내 경우에는 색상 코드를 수정해야 했기 때문에 XX
실제로는 굵은 파란색 코드 [1;34m
와 YY
굵은 회색 코드 가 되었습니다 [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
- 먼저 모든 인스턴스를 변경
XX
하고YY
.
s/XX/YY/g
- 그런 다음 다음 으로 시작하는
\nYY
모든 항목을 바꿉니다.\nXX
s/\\nYY/\nXX/g
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
내 동료 중 한 명이 말했듯이 모든 길은 로마로 통하며 어떤 길은 다른 길보다 빠릅니다.