![<>로 둘러싸인 각 숫자를 제거하는 방법](https://linux55.com/image/58367/%26lt%3B%26gt%3B%EB%A1%9C%20%EB%91%98%EB%9F%AC%EC%8B%B8%EC%9D%B8%20%EA%B0%81%20%EC%88%AB%EC%9E%90%EB%A5%BC%20%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
나는 이것을 시도했다
sed -i '' 's/[0-9]*<>/g'
그러나 그것은 작동하지 않았습니다.
예시 파일:
<Number1>
</Number8>
산출:
<Number>
</Number>
답변1
실제로 해보면 정말 쉽습니다 sed
. 한 번에 최대한 많은 것을 얻은 다음 다시 t
ry, t
ry를 수행합니다.
sed -e :t -e 's/\(<[^<]*\)[0-9]\{1,\}\([^>]*>\)/\1\2/g;tt'
다음과 같은 임의 입력 비트를 사용해 보았습니다.
<Number1>
234234 </Nu994845mb6er8>'
234234 <000000000000000000000000000000000000>>
<a1> 2 <34b5c> 6 7 def
결과 :
<Number>
234234 </Number>
234234 <>>
<a> 2 <bc> 6 7 def
<
정규식은 a 와 a 사이의 숫자 중 하나 이상만 일치합니다 >
. 더 이상 성공적으로 수행할 수 없을 때까지 일련의 숫자를 다른 것으로 계속 교체합니다. 이것이 est 명령의 목적입니다 t
.
그렇지 않으면 할 수 있습니다아니요다음과 같은 루프:
sed 's/^/>/;s/\(>[^<>]*\)*[0-9]*/\1/g;s/.//' <<\INPUT
<Number1>
234234 </Nu994845mb6er8>'
234234 <000000000000000000000000000000000000>>
<a1> 2 <34b5c> 6 7 def
INPUT
산출
<Number>
234234 </Number>'
234234 <>>
<a> 2 <bc> 6 7 def
>
발견될 때까지 항상 하나를 건너뛰므로 그룹 <
에만 영향을 미칩니다 <[^<>]*>
. 바라보다이것관심이 있다면 이유를 알고 싶습니다.
답변2
다음은 작동합니다:
sed -i 's/\(<[^0-9>]*\)[0-9]*\([^0-9]*>\)/\1\2/g' filename
답변3
대체 명령(sed와 perl 모두에서 가능) 주위에 루프가 필요하거나 중첩된 대체 명령(perl에만 해당)이 필요합니다. 나는 후자의 접근 방식을 선호합니다. 이것은 좀 더 일반적입니다.
perl -pe 's/\<([^>]*)\>/do{$a = $1; $a =~ s,\d,,g; "\<" . $a . "\>"}/ge;'
입력 예:
<a1> 2 <34b5c> 6 7 def
산출:
<a> 2 <bc> 6 7 def
설명: 이 -p
옵션은 파일을 한 줄씩 읽고, 각 줄에서 스크립트를 실행한 다음 결과를 인쇄한다는 의미입니다(sed에서와 마찬가지로). -e
다음 매개변수가 실행될 스크립트라는 의미입니다.
본질적으로 스크립트는 단지 대체 명령일 뿐입니다. find <
, 그 뒤에 문자가 아닌 >
문자가 올 수 있고 마지막으로 가 옵니다 >
. e
꼬리 뒤의 수정자는 /
교체 명령의 특수 기능을 나타냅니다. 교체 부분은 인쇄할 문자열이 아니라 실행할 명령 시퀀스입니다. 이 명령 시퀀스에서는 먼저 및 (예: ) <
사이의 문자열을 새 변수에 할당한 다음 각 숫자 ( )를 null로 바꾸는 또 다른 대체 명령을 수행 하고 마지막으로 를 반환 한 다음 수정된 문자 문자열, 을 차례로 수행합니다 . end 및 end 뒤의 수정자는 첫 번째 문자열뿐만 아니라 일치하는 모든 문자열에 대해 바꾸기 명령을 수행해야 함을 의미합니다.>
$1
$a
$a
\d
<
>
g
/
,
시작 <
과 해당이 >
다른 줄에 있을 수 있다면 다음과 같이 말하세요.
<abc1
opt="def">
Perl이 한 줄씩 작업하는 대신 처리하기 전에 전체 파일을 읽을 수 있도록 옵션 -0777
(예: )을 추가합니다(perl -0777 -pe '...'
흡연 모드).
답변4
짧은 sed 모드
sed 's/<\([^>]\+\)[0-9]\+>/<\1>/g' file