Perl 정규식에서 % 토큰을 바꾸되 \%는 바꾸지 마세요.

Perl 정규식에서 % 토큰을 바꾸되 \%는 바꾸지 마세요.

[^\]%토큰 대신 sed - 명령에서 토큰을 교체하는 방법이 궁금합니다.\%답변. 뒷모습은 필요 없을 것 같아요.

현재 Sed 명령이지만 여기서는 Perl이 필수라고 생각합니다.

cat something | sed 's#%.*</#</#'                

또한 %기호 뒤의 모든 내용, 즉 LaTeX의 모든 주석이 제거되지만 백분율 값은 제거되지 않습니다.

Perl을 사용한 실패한 시도

cat something | perl 's#[^\]%.*</#</#'

나는 Perl이 cat의 표준 출력을 얻는 방법을 모릅니다.

데이터

------------------------------
Protocol of pre-eclampsia
------------------------------
Monitoring in 90\% cases

Antihypertensives when % this is a comment, please, remove me!
$SBP/DBP > 160/110$; slowly.     
------------------------------

원하는 출력

------------------------------
Protocol of pre-eclampsia
------------------------------
Monitoring in 90\% cases

Antihypertensives when
$SBP/DBP > 160/110$; slowly.     
------------------------------

%그렇게 하지 않고 어떻게 플래그를 교체할 수 있습니까 \%? Sed를 통해 이 작업을 수행할 수 있는 경우 댓글을 남겨주세요.

답변1

많은(대부분은 아니지만) 텍스트 구문 분석 도구가 perl명령줄에서 입력을 받기 때문에 필수는 아닙니다 cat. -e스크립트를 명령줄 인수로 전달하기 위해 필요한 것입니다. -n즉, "입력의 각 줄에서 스크립트를 실행합니다"를 의미합니다. ". 또는 -p"각 입력 줄에서 스크립트를 실행한 다음 해당 줄을 인쇄"하는 스위치를 사용할 수 있습니다 . 이 두 명령은 동일합니다(그러나 두 번째 명령은 cat의 전형적인 쓸모없는 사용이므로 첫 번째 명령을 사용하십시오).

perl -pe 's/foo/bar/' file
cat file | perl -pe 's/foo/bar/'

이제 내가 올바르게 이해했다면 모든 LaTeX 주석을 제거하고 싶을 것입니다(귀하의 질문에 나와 있는 내용은 아니지만). 그렇다면,뒤를 봐가장 간단한 방법은 다음과 같습니다.

perl -pe 's/(?<!\\)%.*//' file 

정규식도 작동해야 합니다. 이전에 일치하는 문자를 유지하고 %백슬래시를 이스케이프하면 됩니다.

perl -pe 's/(^|[^\\]+)%.*/$1/' file

GNU에서도 같은 일을 할 수 있습니다 sed:

sed -r 's/(^|[^\\])%.*/\1/' file

답변2

뒤에 오는 내용만 바꾸고 %다음 내용은 바꾸지 않으 려면 \%Perl에서 가장 쉬운 방법은 다음을 사용하는 것입니다.부정적인 리뷰%.*:앞에 백슬래시가 없는 경우에만 일치합니다.

perl -pe 's/(?<!\\)%.*//'

그러나 이것은 그런 것과 일치하지 않습니다 Hello world.\\%wibble. 이렇게 하려면 %앞에 백슬래시 개수가 짝수인지 확인해야 합니다. Perl의 뒤돌아보기는 고정 길이 패턴만 지원하기 때문에 뒤돌아보기로는 이 작업을 수행할 수 없습니다. 대신 정규식에서 백슬래시를 일치시키고 뒤돌아보기를 사용하여 정규식이 모든 백슬래시를 포착하는지 확인하세요.

perl -pe 's/(?<!\\)((?:\\\\)*)%.*/$1/'

LookBehind를 지원하지 않는 도구를 사용하여 이 작업을 수행할 수도 있습니다. 이 경우 까다로운 일련의 대체 명령을 사용하거나 백슬래시를 일치시켜 대체 텍스트에 복사해야 합니다.

sed -e 's/^\(\(\\\\\)*\)%.*/\1/' -e 's/\([^\\]\(\\\\\)*\)%.*/\1/'

LaTeX 문서로 작업하는 경우 축자 블록과 같은 다른 백분율 기호를 유지해야 할 수도 있습니다. 정규식만으로는 이 작업을 수행할 수 없습니다.

답변3

이스케이프되지 않은 문자를 바꾸는 일반적인 관용어 perl는 다음과 같습니다.

$ printf '%s\n' '% \% \\% \\\%' | perl -pe 's/(\\.)|%/$1||"<replacement>"/ge'
<replacement> \% \\<replacement> \\\%

따라서 unescaped로 시작하는 모든 항목을 제거하려면 다음을 수행하십시오 %.

perl -pe 's/(\\.)|%.*/$1/g'

(FreeBSD/GNU)를 sed지원하는 경우 :-E

sed -E 's/(\\.)|%.*/\1/g'

또는 GNU를 사용하십시오 sed:

sed 's/\(\\.\)\|%.*/\1/g'

대체 RE 연산자를 사용할 수 없는 경우(표준 기본 RE에서와 같이) 일반적으로 다음을 사용할 수 있습니다 \{0,1\}.

sed 's/\(\(\(\\.\)\{0,1\}[^\\%]*\)*\)\(%.*\)\{0,1\}/\1/'

관련 정보