p='[:punct:]' s='[:space:]'
sed -Ee'1!{/\n/!b' -e\} \
-e's/(\n*)(.*)/ \2 \1/' \
-e"s/is[$p]?[$s]/\n&/g" \
-e"s/([^$s])\n/\1/g;1G" \
-e:c -e"s/\ni(.* )\n{3}/u\1/" \
-e"/\n$/!s/\n//g;/\ni/G" \
-e's//i/;//tc' \
-e's/^ (.*) /\1/;P;$d;N;D'
그 비트는 한 줄에서 다음 줄로 발생 sed
하는 집계를 전달합니다 is
. is
줄마다 던질 때마다 많은 es를 안정적으로 처리 해야하며 오래된 줄을 버퍼링 할 필요 is
가 없습니다. 다른 단어의 일부가 아닌 모든 줄마다 하나의 줄 바꿈 문자를 유지합니다 .
결과는 파일에서 세 번째 항목 만 수정하고 한 줄에 카운트를 수행한다는 것입니다. 따라서 파일이 다음과 같은 경우
1. is is isis
2. is does
... 인쇄됩니다 ...
1. is is isis
2. us does
먼저 모든 라인의 머리와 꼬리에 공간을 삽입하여 가장자리 케이스를 처리합니다. 이를 통해 단어 경계를 좀 더 쉽게 확인할 수 있습니다.
그런 다음 공백이 오는 0 또는 하나의 문장 부호 문자 바로 앞에 나오는 모든 행 앞에 ewline is
을 삽입하여 유효한 es를 찾습니다 . 다른 패스를 수행하고 공백이 아닌 문자 바로 앞에 오는 모든 ewline을 제거합니다 . 남아이 마커가 일치 하고 있지만 나 .\n
is
\n
is.
is
this
?is
그런 다음 각 마커를 문자열 의 꼬리에 모 읍니다 \ni
. 줄의 모든 일치에 대해 \n
문자열의 꼬리에 ewline을 추가하고 i
또는로 대체합니다 u
. \n
줄 끝에 꼬리에 모인 3 개의 줄 이 있으면 u를 사용하고 그렇지 않으면 i를 사용합니다. au가 처음 사용될 때도 마지막입니다-교체는 무한 루프를 시작 get line, print line, get line, print line,
합니다.
각 try 루프 사이클이 끝날 때마다 삽입 된 공간을 정리하고 패턴 공간에서 처음 나타나는 줄 바꿈까지만 인쇄 한 다음 다시 진행합니다.
l
루프 헤드에 다음과 같은 ook 명령을 추가합니다 .
l; s/\ni(.* )\n{9}/u\1/...
...이 입력으로 작동하는 방식을 살펴보십시오.
hai this is linux.
hai this is unix.
hai this is mac.
hai this is unchanged is.
... 그것이하는 일은 다음과 같습니다.
hai this \nis linux. \n$ #behind the scenes
hai this is linux. #actually printed
hai this \nis unix. \n\n$ #it builds the marker string
hai this is unix.
\n\n\n$ #only for lines matching the
\n\n\n$ #pattern - and not otherwise.
hai this \nis mac. \n\n\n$ #here's the match - 3 ises so far in file.
hai this us mac. #printed
hai this is unchanged is. #no look here - this line is never evaled
한 is
줄에 더 많은 es 가 있으면 더 의미가 있습니다.
nthword()( p='[:punct:]' s='[:space:]'
sed -e '1!{/\n/!b' -e\} \
-e 's/\(\n*\)\(.*\)/ \2 \1/' \
-e "s/$1[$p]\{0,1\}[$s]/\n&/g" \
-e "s/\([^$s]\)\n/\1/g;1G;:c" \
-e "${dbg+l;}s/\n$1\(.* \)\n\{$3\}/$2\1/" \
-e '/\n$/!s/\n//g;/\n'"$1/G" \
-e "s//$1/;//tc" -e 's/^ \(.*\) /\1/' \
-e 'P;$d;N;D'
)
POSIX BRE와 초보적인 인수 처리를 사용하여 작성되었지만 실제로는 동일합니다.
printf 'is is. is? this is%.0s\n' {1..4} | nthword is us 12
... 가져옵니다 ...
is is. is? this is
is is. is? this is
is is. is? this us
is is. is? this is
... 활성화하면 ${dbg}
:
printf 'is is. is? this is%.0s\n' {1..4} |
dbg=1 nthword is us 12
... 우리는 그것을 반복 볼 수 있습니다 ...
\nis \nis. \nis? this \nis \n$
is \nis. \nis? this \nis \n\n$
is is. \nis? this \nis \n\n\n$
is is. is? this \nis \n\n\n\n$
is is. is? this is
\nis \nis. \nis? this \nis \n\n\n\n\n$
is \nis. \nis? this \nis \n\n\n\n\n\n$
is is. \nis? this \nis \n\n\n\n\n\n\n$
is is. is? this \nis \n\n\n\n\n\n\n\n$
is is. is? this is
\nis \nis. \nis? this \nis \n\n\n\n\n\n\n\n\n$
is \nis. \nis? this \nis \n\n\n\n\n\n\n\n\n\n$
is is. \nis? this \nis \n\n\n\n\n\n\n\n\n\n\n$
is is. is? this \nis \n\n\n\n\n\n\n\n\n\n\n\n$
is is. is? this us
is is. is? this is