<>로 둘러싸인 각 숫자를 제거하는 방법

<>로 둘러싸인 각 숫자를 제거하는 방법

나는 이것을 시도했다

sed -i '' 's/[0-9]*<>/g'

그러나 그것은 작동하지 않았습니다.

예시 파일:

<Number1>
</Number8>

산출:

<Number>
</Number>

답변1

실제로 해보면 정말 쉽습니다 sed. 한 번에 최대한 많은 것을 얻은 다음 다시 try, try를 수행합니다.

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

관련 정보