首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在保持顺序的同时,如何从字符串B中删除出现在字符串A中的汉字?

问在保持顺序的同时,如何从字符串B中删除出现在字符串A中的汉字?
EN

Unix & Linux用户
提问于 2020-08-20 08:45:00
回答 3查看 471关注 0票数 1

我有一些长串的汉字,但为了这个问题,我们假设它们是:

代码语言:javascript
复制
啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板

和

代码语言:javascript
复制
阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔

第一个字符串列出了所有的“简单”汉字。第二个字符串列出所有“轻松”和“中间”汉字,但我只想要“中间”汉字:我想从第二个字符串中删除“轻松”字符。

例如,编辑后,第二个字符串将不包含啊或爱(可能还有更多的删除),因为它们都发生在第一个字符串中。

问题:当字符串B出现在字符串A中时,如何在保持顺序的同时从字符串B中删除汉字?

我觉得这应该可以用awk或sed之类的方法解决;我不介意。看起来,我可以将这些字符串转换成两个文本文件,并使用如何从另一个文件A中删除B文件中出现的行?中的任何一个命令,但是,我宁愿不创建辅助文件。

保持字符串中字符的顺序也很重要。

EN

回答 3

Unix & Linux用户

发布于 2020-08-21 03:47:25

在允许语法${parameter/pattern/string} (ksh、bash、zsh)的shell中,可以这样做:

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

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

这是基于一个类似正则表达式的选择字符[…]。intermediate中也存在于easy中的所有单独字符都将被删除。

与外壳无关的对等物可以是:

代码语言:javascript
复制
$ echo "$intermediate" | sed 's/['"$easy"']//g'

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

Unix & Linux用户

发布于 2020-08-23 03:48:15

using Raku (née Perl6)

Raku是从地面开始设计的,可以优雅地处理Unicode。下面每对的第一个例子通常来自于Raku文档;第二个例子是每对都适合于用特定的中文字符串来求解:

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

或

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

-pe命令行标志指示Raku接受输入行并自动生成返回值(S)。tr///操作符和trans()例程之间有一些细微的差别。医生在下面,HTH。

https://docs.raku.org/language/operators#tr///_就地_音译 https://docs.raku.org/routine/trans https://raku.org/

票数 1
EN

Unix & Linux用户

发布于 2020-08-20 09:43:05

我想出来了!这可能不是最好的解决办法,但它有效:

代码语言:javascript
复制
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'去掉了所有的新行

它给出输出

代码语言:javascript
复制
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔

并移除啊,爱,安和按字符。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/605401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档