sed가 스트림의 단어 경계 패턴과 일치하지 않습니다.

sed가 스트림의 단어 경계 패턴과 일치하지 않습니다.

소스 파일과 헤더 파일을 인쇄하는 makefile 레시피가 있습니다. Autotools 레시피에 사용할 출력을 수정하려고 합니다. 출력은 make sources아래와 같습니다.

다음으로 끝나는 단어를 제거해야 합니다 simd.cpp. SIMD 파일에는 특수 아키텍처 플래그가 필요하므로 목록에 포함되지 않습니다. 비슷한 것을 찾았어요스택 오버플로에 대한 질문하지만 simd가 포함된 파일 이름은 삭제되지 않습니다.

다음은 단어를 일치시켜 스트림에서 제거하려는 시도입니다. 그들 중 누구도 모든 단어를 삭제하지 않았습니다. 사실, 나는 어떤 simd 단어도 제거되었다고 믿지 않습니다.

  • sed -e 's|\b[*]\-simd.cpp[^ ]*||g'
  • sed -e 's|\b[*]-simd.cpp[^ ]*||g'
  • sed -e 's|\b*-simd.cpp[^ ]*||g'
  • sed -e 's|\b*\-simd.cpp[^ ]*||g'
  • sed -e 's|\b*\-simd.cpp||g'
  • sed -e 's|\b*-simd.cpp||g'
  • sed -e 's|\b-simd.cpp||g'

스택 오버플로 질문에서 제가 이해한 바에 따르면, \b단어를 일치시키기 위해 선행은 *단어의 첫 번째 부분을 캡처하고 -simd.cpp[^ ]*후행 공백을 포함하여 단어의 마지막 부분과 일치합니다.

어떤 오해가 있고 어떻게 해결할 수 있나요?


이것은 제거해야 할 단어의 출력입니다 *-simd.cpp.

$ make sources | fold -w80 -s
***** Library sources *****
cryptlib.cpp cpu.cpp integer.cpp 3way.cpp adler32.cpp algebra.cpp algparam.cpp
arc4.cpp aria-simd.cpp aria.cpp ariatab.cpp asn.cpp authenc.cpp base32.cpp
base64.cpp basecode.cpp bfinit.cpp blake2-simd.cpp blake2.cpp blowfish.cpp
blumshub.cpp camellia.cpp cast.cpp casts.cpp cbcmac.cpp ccm.cpp chacha.cpp
cham-simd.cpp cham.cpp channels.cpp cmac.cpp crc-simd.cpp crc.cpp default.cpp
des.cpp dessp.cpp dh.cpp dh2.cpp dll.cpp dsa.cpp eax.cpp ec2n.cpp eccrypto.cpp
ecp.cpp elgamal.cpp emsa2.cpp eprecomp.cpp esign.cpp files.cpp filters.cpp
fips140.cpp fipstest.cpp gcm-simd.cpp gcm.cpp gf256.cpp gf2_32.cpp gf2n.cpp
gfpcrypt.cpp gost.cpp gzip.cpp hc128.cpp hc256.cpp hex.cpp hight.cpp hmac.cpp
hrtimer.cpp ida.cpp idea.cpp iterhash.cpp kalyna.cpp kalynatab.cpp keccak.cpp
lea-simd.cpp lea.cpp luc.cpp mars.cpp marss.cpp md2.cpp md4.cpp md5.cpp
misc.cpp modes.cpp mqueue.cpp mqv.cpp nbtheory.cpp neon-simd.cpp network.cpp
oaep.cpp osrng.cpp padlkrng.cpp panama.cpp pkcspad.cpp poly1305.cpp
polynomi.cpp ppc-simd.cpp pssr.cpp pubkey.cpp queue.cpp rabbit.cpp rabin.cpp
randpool.cpp rc2.cpp rc5.cpp rc6.cpp rdrand.cpp rdtables.cpp rijndael-simd.cpp
rijndael.cpp ripemd.cpp rng.cpp rsa.cpp rw.cpp safer.cpp salsa.cpp scrypt.cpp
seal.cpp seed.cpp serpent.cpp sha-simd.cpp sha.cpp sha3.cpp shacal2-simd.cpp
shacal2.cpp shark.cpp sharkbox.cpp simeck-simd.cpp simeck.cpp simon-simd.cpp
simon.cpp skipjack.cpp sm3.cpp sm4-simd.cpp sm4.cpp socketft.cpp sosemanuk.cpp
speck-simd.cpp speck.cpp square.cpp squaretb.cpp sse-simd.cpp strciphr.cpp
tea.cpp tftables.cpp threefish.cpp tiger.cpp tigertab.cpp trdlocal.cpp
ttmac.cpp tweetnacl.cpp twofish.cpp vmac.cpp wait.cpp wake.cpp whrlpool.cpp
xtr.cpp xtrcrypt.cpp zdeflate.cpp zinflate.cpp zlib.cpp

...

답변1

[], 내부 *는 리터럴 문자이고 외부는 수량자입니다.

여기서는 단어 경계 앵커()를 사용하는 데 아무런 가치가 없습니다 \b. 아마도 비어 있지 않은 영숫자 문자 뒤에 접미사가 오는 것과 같은 것을 일치시키고 싶을 것입니다 -simd.cpp.s/[[:alnum:]]*-simd.cpp//g

다음을 사용하여 일치하는 콘텐츠를 확인할 수 있습니다 grep.

$ grep -o '[[:alnum:]]*-simd.cpp' sources 
aria-simd.cpp
blake2-simd.cpp
cham-simd.cpp
crc-simd.cpp
gcm-simd.cpp
lea-simd.cpp
neon-simd.cpp
ppc-simd.cpp
rijndael-simd.cpp
sha-simd.cpp
shacal2-simd.cpp
simeck-simd.cpp
simon-simd.cpp
sm4-simd.cpp
speck-simd.cpp
sse-simd.cpp

영숫자 문자열이 충분히 일반적이지 않은 경우 공백이 아닌 문자 범위를 일치시킬 수 있습니다.[^[:blank:]]*

관련 정보