Как удалить китайские символы из строки B всякий раз, когда они встречаются в строке A, сохраняя при этом порядок?

Я не знаю ни одной команды, которая точно соответствовала бы вашим требованиям. Что-то вроде этого должно работать (удалите --dry-runкогда вы уверены, что довольны результатом; замените --verboseна --quiet, если вы хотите, чтобы он работал тише):

src=/path/to/source
dst=/path/to/target

comm -z -23 \
        <(find "$src" -type f -printf '%P\0' | sort -z) \
        <(find "$dst" -type f -mmin -60 -printf '%P\0' | sort -z) |
    rsync --dry-run --verbose --archive --from0 --files-from - "$src" "$dst"

Предполагается, что относительно новые утилиты понимают, как обрабатывать строки, завершающиеся NUL -. При необходимости и при условии, что вы можете гарантировать, что имена файлов не содержат символов новой строки, вы можете удалить три флага -zи rsync--from0и заменить \0в командах findна \n.

1
20.08.2020, 11:45
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'избавляется от всех новых строк

Выдает результат

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

и удаляет символы 啊, 爱, 安 и 按.

0
18.03.2021, 23:11

В оболочках, поддерживающих синтаксис${parameter/pattern/string}(ksh,bash,zsh )вы можете сделать:

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

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

Это основано на регулярном выражении -подобно выбору символов […].
Все отдельные символы в intermediate, которые также существуют в easy, будут стерты.

Эквивалентом, который не зависит от оболочки, может быть:

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

阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔
1
18.03.2021, 23:11

с использованием Раку (урожденная Perl6)

Raku был разработан с нуля -для изящной обработки Unicode. Первый пример каждой пары ниже, как правило, из документации 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 принимать ввод построчно и автоматически печатать возвращаемое значение (s ). Между оператором tr///и подпрограммой trans()есть небольшие различия. Документы ниже, HTH.

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

1
18.03.2021, 23:11

Теги

Похожие вопросы