我有一些长串的汉字,但为了这个问题,我们假设它们是:
啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板和
阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔第一个字符串列出了所有的“简单”汉字。第二个字符串列出所有“轻松”和“中间”汉字,但我只想要“中间”汉字:我想从第二个字符串中删除“轻松”字符。
例如,编辑后,第二个字符串将不包含啊或爱(可能还有更多的删除),因为它们都发生在第一个字符串中。
问题:当字符串B出现在字符串A中时,如何在保持顺序的同时从字符串B中删除汉字?
我觉得这应该可以用awk或sed之类的方法解决;我不介意。看起来,我可以将这些字符串转换成两个文本文件,并使用如何从另一个文件A中删除B文件中出现的行?中的任何一个命令,但是,我宁愿不创建辅助文件。
保持字符串中字符的顺序也很重要。
发布于 2020-08-21 03:47:25
在允许语法${parameter/pattern/string} (ksh、bash、zsh)的shell中,可以这样做:
$ easy='啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板'
$ intermediate='阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔'
$ echo "${intermediate//[$easy]/}"
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔这是基于一个类似正则表达式的选择字符[…]。intermediate中也存在于easy中的所有单独字符都将被删除。
与外壳无关的对等物可以是:
$ echo "$intermediate" | sed 's/['"$easy"']//g'
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔发布于 2020-08-23 03:48:15
using Raku (née 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///_就地_音译 https://docs.raku.org/routine/trans https://raku.org/
发布于 2020-08-20 09:43:05
我想出来了!这可能不是最好的解决办法,但它有效:
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'去掉了所有的新行它给出输出
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔并移除啊,爱,安和按字符。
https://unix.stackexchange.com/questions/605401
复制相似问题