'sed'를 사용하여 10자리 숫자 시퀀스를 1234567890으로 바꾸고 싶습니다.
이것은 작동하지만 매우 우아하지는 않습니다.
echo "code=1111111111" | sed 's/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/1234567890/'
이건 작동하지 않아
echo "code=1111111111" | sed 's/[0-9]{10}/1234567890/'
결과
code=1111111111
누구든지 'sed'를 사용하여 간단하고 우아한 솔루션을 제안할 수 있습니까?
답변1
sed
기본 정규식은 기본적으로 사용됩니다. 즉, {10}
일반 텍스트로 처리됩니다.
다음을 통해 확인할 수 있습니다.
echo "code=1{10}" | sed 's/[0-9]{10}/1234567890/'
다음을 출력합니다:
1234567890
귀하의 경우에는 다음이 필요합니다.
-E
확장 정규식을 사용하도록 지정하려면 이 옵션을 사용하십시오 .- 다음과 같이 탈출
{
하고}
가십시오\{10\}
.
echo "code=1111111111" | sed -E 's/[0-9]{10}/1234567890/'
echo "code=1111111111" | sed 's/[0-9]\{10\}/1234567890/'
답변2
sed
다른 사람들은 기본적으로 POSIX를 이해하는 POSIX 확장 정규식을 사용하려고 한다고 지적했습니다.기초적인자주 사용되는 표현. 이 옵션을 사용하면 도구의 일부(대부분) 구현에서 확장 정규식을 이해하지만 -E
로 변경하여 표현식을 기본 표현식으로 변경할 수도 있습니다.{10}
\{10\}
하지만 확실히 교체하고 싶다면옳은10자리의 경우 입력의 다른 곳에 나타나는 숫자뿐만 아니라 긴 숫자도 일치시키지 않는 것이 좋습니다.
=
입력에 대해 더 자세히 알지 못한 채 문자와 줄 끝을 일치시켜 일치를 제한하겠습니다.
sed 's/=[0-9]\{10\}$/=1234567890/'
=
이렇게 하면 a와 줄 끝 사이에 나타나지 않는 긴 숫자와 10자리 숫자가 일치하는 것을 방지할 수 있습니다 .
code
변수(또는 다른 값)의 값을 변경해야 한다는 것을 알고 있는 경우 code
해당 이름도 일치시킵니다(여기서는 이름이 줄의 시작 부분에서 시작한다고 가정하고 해당 이름을 캡처합니다). \1
중복을 줄이기 위해 교체 로 교체 ) :
sed 's/^\(code\)=[0-9]\{10\}$/\1=1234567890/'
답변3
ERE
정규식 스타일을 사용하십시오 .
$ echo "code=1111111111" | sed -E 's/[0-9]{10}/1234567890/'
code=1234567890
답변4
첫 번째 시퀀스 10을 교체하려는 경우그리고 그게 다야1234567890 ASCII 십진수의 각 줄은 다음과 같아야 합니다.
sed -E 's/(^|[^0123456789])[0123456789]{10}([^0123456789]|$)/\112345678900\2/'
즉, 10자리 숫자( 구현 및/또는 로케일 에 따라 0123456789 대신 0123456789 [0123456789]
대신 사용 )를 대체하고 그 앞에 줄 시작 또는 숫자가 아닌 문자가 오고 숫자 또는 숫자가 아닌 문자가 뒤에 옵니다. 줄 끝 .[0-9]
sed
이는 여전히 또는 또는 1112223334.6
로 대체되므로 원하는 내용 과 입력에서 찾을 수 있는 내용에 따라 조정해야 할 수도 있습니다 .1234567890.6
1.0000000000e-2
1.1234567890e-2
0xff0777888999ee
0xff1234567890ee
바꾸다모두10의 순서그리고 그게 다야번호는 다음과 같을 수 있습니다:
sed -E 's/[0123456789]+/\
&\
/g; s/\n[0123456789]{10}\n/123456789/g;s/\n//g'
또는 다음으로 전환할 수 있습니다 perl
.
perl -pe 's/(?<!\d)\d{10}(?!\d)/1234567890/g'
부정 예측 연산자를 사용하여 10진수 시퀀스의 앞이나 뒤에 다른 숫자가 오지 않는지 확인합니다.