![sed를 사용하여 문자열의 값을 바꾸지만 문자열은 그대로 유지하는 방법](https://linux55.com/image/78719/sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%98%20%EA%B0%92%EC%9D%84%20%EB%B0%94%EA%BE%B8%EC%A7%80%EB%A7%8C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%80%20%EA%B7%B8%EB%8C%80%EB%A1%9C%20%EC%9C%A0%EC%A7%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
sed를 사용하여 문자열의 값을 바꾸면서 문자열을 그대로 유지하는 방법은 무엇입니까?
예를 들어echo "01XX1234"
XX
16진수 값으로 바꾸고 합계를 01
변경하지 않고 유지하고 싶습니다 1234
. 제가 생각할 수 있는 모든 조합을 시도했지만 sed
여전히 패배했습니다.
이렇게 할 수는 있지만 더 쉬운 방법이 있나요?
echo "01XX1234" | sed -n 's/\(01..1234\)/01AB1234/g'
답변1
sed
문자열의 일치하는 하위 문자열만 대체됩니다.
$ echo '01XX1234' | sed 's/XX/AF/'
01AF1234
세 번째와 네 번째 문자는 항상 바꾸고 첫 번째와 두 번째 문자는 변경하지 않으려면 다음을 사용할 수 있습니다.
$ echo '01XX1234' | sed 's/\(.\{2\}\).\{2\}/\1AF/'
01AF1234
\{2\}
앞의 문자가 두 번 나타나는 것을 의미합니다(이 경우에는.
임의의 문자).\(...\)
괄호는 일치 그룹을 만드는 데 사용됩니다. 나중에 패턴이나 대체 문자열에서 일치하는 하위 문자열을 참조할 수 있습니다.\1
첫 번째로 일치하는 하위 문자열을 나타냅니다(이 경우 "01").
답변2
echo "01XX1234" | sed 's/XX/AB/'
또는
echo "01XX1234" | sed 's/\(01\).*\(1234\)/\1AB\2/'
답변3
예약된 공간 사용:
> echo "01XX1234" | sed -n 'h;s/01..1234/01AB1234/g;p;x;p'
01AB1234
01XX1234
sed 명령:
- h --> 패턴 공간을 저장 공간으로 이동합니다.
- 피 --> 인쇄
- x --> 홀드 공간과 패턴 공간 교환