문자열 A에 한자가 나타나는 경우 순서를 유지하면서 문자열 B에서 이를 제거하려면 어떻게 해야 합니까?

문자열 A에 한자가 나타나는 경우 순서를 유지하면서 문자열 B에서 이를 제거하려면 어떻게 해야 합니까?

매우 긴 중국어 문자열이 있지만 이 질문을 위해 다음과 같이 가정하겠습니다.

啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板

그리고

阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔

첫 번째 문자열에는 모든 "간단한" 중국어 문자가 나열됩니다. 두 번째 문자열에는 "yi" 및 "中" 한자가 모두 나열되지만 "中" 한자만 필요합니다. 두 번째 문자열에서 "yi" 문자를 제거하고 싶습니다.

예를 들어 편집 후 두 번째 문자열에는 "ah" 또는 "love"가 포함되지 않습니다(아마도 더 많은 삭제 항목 포함). 둘 다 첫 번째 문자열에 나타나기 때문입니다.

질문: 문자열 A에 한자가 나타날 때 순서를 유지하면서 문자열 B에서 한자를 제거하는 방법은 무엇입니까?

나는 이것이 awk또는 sed다른 것으로 해결될 수 있을 것이라고 생각합니다. 이 문자열을 두 개의 텍스트 파일로 변환하고 두 명령 중 하나를 사용할 수 있는 것 같습니다.다른 파일 A에서 파일 B에 있는 줄을 삭제하는 방법은 무엇입니까? 하지만 저는 보조 파일을 만들지 않고 이 작업을 수행하고 싶습니다.

문자열의 문자 순서를 유지하는 것도 중요합니다.

답변1

구문(ksh, bash, zsh)을 허용하는 셸에서 ${parameter/pattern/string}다음을 수행할 수 있습니다.

$ easy='啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板'
$ intermediate='阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔'

$ echo "${intermediate//[$easy]/}" 
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔

이는 정규식과 유사한 문자 선택을 기반으로 합니다 […]. 존재하는 모든 단일 문자
는 삭제됩니다.intermediateeasy

쉘 독립적인 대응은 다음과 같습니다:

$ echo "$intermediate" | sed 's/['"$easy"']//g'

阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔

답변2

Raku 사용(옛 Perl6)

Raku는 유니코드를 우아하게 처리하도록 설계되었습니다. 아래 각 쌍의 첫 번째 예는 일반적으로 Raku 문서에서 가져온 것입니다. 각 쌍의 두 번째 예는 특정 중국어 문자열을 푸는 데 적용됩니다.

$ echo "a123b123c" | raku -pe 'tr:d/123//;'
abc
$ echo "阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔" | raku -pe 'tr:d/啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板//;'
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔

또는

$ echo "a123b123c" | raku -pe '.=trans("123" => "");'
abc
$ echo "阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔" | raku -pe '.=trans("啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板" => "");'
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔

명령 -pe줄 플래그는 Raku가 한 줄씩 입력을 받아 자동으로 반환 값을 인쇄하도록 지시합니다. tr///연산자와 루틴 사이에는 미묘한 차이가 있습니다 trans(). 아래 문서, HTH.

https://docs.raku.org/언어/operators#tr///_in-place_transliteration
https://docs.raku.org/routine/trans
https://raku.org/

답변3

나는 그것을 생각했다! 최선의 해결책은 아닐 수도 있지만 다음과 같이 작동합니다.

echo 阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔 | sed -e "s/.\{1\}/&\n/g" | awk -v pat="啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板" 'pat ~ $0' | tr -d '\n'

설명하다:

  • echo 阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔두 번째 문자열을 입력으로 파이프하는 방법입니다.
  • sed -e "s/.\{1\}/&\n/g"각 문자 뒤에 개행 추가
  • awk -v pat="啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板" 'pat !~ $0'pat(첫 번째 문자열)에 없는 문자만 인쇄합니다.
  • tr -d '\n'모든 줄 바꿈을 제거하십시오

그것은 출력을 제공합니다

阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔

그리고 "Ah", "Love", "Ann", "Press" 문자를 삭제하세요.

관련 정보