【发布时间】:2018-08-30 15:23:30
【问题描述】:
我正在尝试清理我的字符串并删除特定的单词。我有一段可以工作的代码,但它不漂亮也不健壮。
输入:the_for_an_apple_this
删除单词:the、for、an
输出:apple_this
#!/bin/bash
str="the_for_an_apple_this"
echo $str
# looping is down because after the awk gsup the next match wouldn't work
counter=0
while [ $counter -le 10 ]
do
# replace with , "_" ?? is this correct, it seems to work
str=`echo $str | awk '{gsub(/(^|_)(the|for|an)($|_)/,"_")}1'`
((counter++))
echo $str
done
# remove beginning or trailing _
str=`echo $str | awk '{gsub(/(^)_/,"")}1' | awk '{gsub(/_($)/,"")}1'`
echo $str
- 这是一个好方法吗? (我使用 awk 是因为我需要最好的跨平台兼容性,而 sed 会出现问题)
- 如何替换我的 while 条件,以便在不再发生匹配时停止。
此处可测试版本:http://rextester.com/BHYSP47270
如何在没有易碎计数器的情况下清理它并使其正常工作?
【问题讨论】:
-
还要注意,最好只使用一个
awk脚本来处理您的整个输入,而不是使用awk的单独副本来处理每一行。awk比 bash 快,但是如果你继续启动它,运行一条线并一遍又一遍地关闭它,你不会从那个性能增量中得到任何好处——事实上,你会得到很多东西比原生 bash 字符串操作慢倍。 -
不过,谈到您的真实用例——您需要保留订单吗?一般来说,集合算术是
comm的工作;见BashFAQ #36