매우 긴 중국어 문자열이 있지만 이 질문을 위해 다음과 같이 가정하겠습니다.
啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板
그리고
阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔
첫 번째 문자열에는 모든 "간단한" 중국어 문자가 나열됩니다. 두 번째 문자열에는 "yi" 및 "中" 한자가 모두 나열되지만 "中" 한자만 필요합니다. 두 번째 문자열에서 "yi" 문자를 제거하고 싶습니다.
예를 들어 편집 후 두 번째 문자열에는 "ah" 또는 "love"가 포함되지 않습니다(아마도 더 많은 삭제 항목 포함). 둘 다 첫 번째 문자열에 나타나기 때문입니다.
질문: 문자열 A에 한자가 나타날 때 순서를 유지하면서 문자열 B에서 한자를 제거하는 방법은 무엇입니까?
나는 이것이 awk
또는 sed
다른 것으로 해결될 수 있을 것이라고 생각합니다. 이 문자열을 두 개의 텍스트 파일로 변환하고 두 명령 중 하나를 사용할 수 있는 것 같습니다.다른 파일 A에서 파일 B에 있는 줄을 삭제하는 방법은 무엇입니까? 하지만 저는 보조 파일을 만들지 않고 이 작업을 수행하고 싶습니다.
문자열의 문자 순서를 유지하는 것도 중요합니다.
답변1
구문(ksh, bash, zsh)을 허용하는 셸에서 ${parameter/pattern/string}
다음을 수행할 수 있습니다.
$ easy='啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板'
$ intermediate='阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔'
$ echo "${intermediate//[$easy]/}"
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔
이는 정규식과 유사한 문자 선택을 기반으로 합니다 […]
. 존재하는 모든 단일 문자
는 삭제됩니다.intermediate
easy
쉘 독립적인 대응은 다음과 같습니다:
$ 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" 문자를 삭제하세요.