[^\]%
토큰 대신 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/'