在一行(macOS,BSD)中多次删除两个字符串(包含)之间的文本

时间:2016-09-08 10:56:01

标签: bash macos awk sed

我有以下一行:

name@mail.addr [The Name], name2@mail2.addr2 [The Name 2], name3@mail.addr3 [Name 3], ...

依此类推,全部在一行($ROW)。 (根据用户从列表中选择的多项选择输出osascript。)

稍后在脚本中我想只在电子邮件地址上运行一个循环:

for ADDRESS in $ROW ; do

默认情况下会使用空格作为分隔符。

所以我需要删除每个“[”(包括前面的空格)和下面的“]之间的所有内容,”......这样结果就是

name@mail.addr name2@mail2.addr2 name3@mail.addr3 ...

直到行尾(变量)。

问题是我在macOS上这样做,它有BSD版本的sed,awk等,直到现在我才能找到GNU解决方案。我确实安装了coreutils,所以我可以用GNU来做,但是这个脚本意味着将macOS分发给其他可能没有安装coreutils的Mac用户,所以GNU sed,awk等都不是一个选项。

2 个答案:

答案 0 :(得分:1)

希望这适合你:

   product  startdate    enddate quarter `mean(price)`
     <int>     <date>     <date>   <chr>         <dbl>
1        1 2012-03-17 2016-09-08 Q1 2012            10
2        1 2012-03-17 2016-09-08 Q1 2013            10
3        1 2012-03-17 2016-09-08 Q1 2014            10
4        1 2012-03-17 2016-09-08 Q1 2015            10
5        1 2012-03-17 2016-09-08 Q1 2016            10
6        1 2012-03-17 2016-09-08 Q2 2012            10
7        1 2012-03-17 2016-09-08 Q2 2013            10
8        1 2012-03-17 2016-09-08 Q2 2014            10
9        1 2012-03-17 2016-09-08 Q2 2015            10
10       1 2012-03-17 2016-09-08 Q2 2016            10
11       1 2012-03-17 2016-09-08 Q3 2012            10
12       1 2012-03-17 2016-09-08 Q3 2013            10
13       1 2012-03-17 2016-09-08 Q3 2014            10
14       1 2012-03-17 2016-09-08 Q3 2015            10
15       1 2012-03-17 2016-09-08 Q3 2016            10
16       1 2012-03-17 2016-09-08 Q4 2012            10
17       1 2012-03-17 2016-09-08 Q4 2013            10
18       1 2012-03-17 2016-09-08 Q4 2014            10
19       1 2012-03-17 2016-09-08 Q4 2015            10

该命令会删除sed 's/\[[^[]*\],//g' <<< $ROW [之间的所有内容,方法是搜索空方括号],,然后是其他任何不是空方括号\[的内容,后跟结束方括号和逗号[^[*]

答案 1 :(得分:0)

我认为这应该适用于bsd grep

for address in $(echo "$ROW" | grep -Eo '[^ ]*@[^ ]*'); do
    ...
done