BASH / sed - 不为简单的sed命令提供相同的输出

时间:2016-12-13 06:32:50

标签: linux bash sed debian darwin

方框1: uname -srm

Darwin 16.1.0 x86_64

方框2: uname -srm; cat / etc / debian_version

Linux 3.13.0-100-generic x86_64
jessie/sid

在box1上的BASH是:GNU bash,版本3.2.57(1)-release(x86_64-apple-darwin16)

在box2上的BASH是:GNU bash,版本4.3.11(1)-release(x86_64-pc-linux-gnu)

在这两个方框中,我都有以下脚本:

#!/bin/bash

args="$@"
cust="$(echo ${args} | sed "s/^[, \t][, \t]*//;s/[, \t][, \t]*$//;s/[ ,][ ,]*/|/g;s/^/^/;s/$/$/;s/|/$|^/g;s/|/\n/g"|sort|uniq|tr '\012' '|'|sed "s/|$//")";
echo --1 ${cust}

cust="$(echo ${args} | sed "s/^[, \t][, \t]*//;s/[, \t][, \t]*$//; \
        s/[ ,][ ,]*/|/g; \
        s/^/^/;s/$/$/; \
        s/|/$|^/g; \
        s/|/\n/g" | sort | uniq | tr '\012' '|' \
        | sed "s/|$//")";
echo --2 ${cust}

cust="$(echo ${args}   | sed "s/^[, \t][, \t]*//;s/[, \t][, \t]*$//")"
cust="$(echo ${cust}   | sed "s/[ ,][ ,]*/|/g")"
cust="$(echo ${cust}   | sed "s/^/^/;s/$/$/")"
cust="$(echo ${cust}   | sed "s/|/$|^/g")"
cust="$(echo ${cust}   | sed "s/|/\n/g")"
cust="$(echo "${cust}" | sort | uniq | tr '\012' '|')"
cust="$(echo ${cust}   | sed "s/|$//")";
echo --3 ${cust}

所有命令都相同。这就是我想要做的事情:

## Remove prefix/suffix space, commas.
## Replce inbetween spaces/commas with '|'.
## Prefix '^' & suffix '$' in the regex value.
## Embedd strict regex pattern for a customer by
## - replacing: '|' with '$|^'
## Sort & Uniq - for alphabetical order & remove duplicates.
## Set ${cust} regex variable with a valid regex value.
## Ex1: ".*" (if no argument is passed i.e. for all IDs).
## Ex2: "^custID1$|^custID2$|^custID3$"
##      (if 'custID1 custID3, custID2' were passed)

在box1上:当我运行带有参数的脚本时: aa1,aa3,aa2 aa1,a0 ,我得到以下输出 NOT < / em>我在输出中期待的内容(字符&#39; n &#39;正在嵌入此处,它甚至没有排序 uniq 对值的操作):

$ ./1.sh aa1, aa3,aa2   aa1 , a0

--1 ^aa1$n^aa3$n^aa2$n^aa1$n^a0$
--2 ^aa1$n^aa3$n^aa2$n^aa1$n^a0$
--3 ^aa1$n^aa3$n^aa2$n^aa1$n^a0$

在方框2上:当我做同样的事情时:我得到了EXPECTED输出。

--1 ^a0$|^aa1$|^aa2$|^aa3$
--2 ^a0$|^aa1$|^aa2$|^aa3$
--3 ^a0$|^aa1$|^aa2$|^aa3$

我应该更改什么,以便上面的表达式在两台机器上提供相同的输出?或者 - 我是否必须在box1上更新BASH?

我的理解是,我正在进行非常简单的sed操作,两个BASH版本都应该为这些简单的sed命令提供相同的输出。

1 个答案:

答案 0 :(得分:1)

添加管道然后将其删除,然后再将它们添加回来似乎有点费解。此代码适用于macOS Sierra 10.12.1(Darwin 16.1.0) - 我相信它也适用于Linux:

#!/bin/bash

args="$*"
IFS=$' \t,'
# echo $args

cust="$(printf '%s\n' ${args} |
        sort -u |
        tr '\012' '|' | 
        sed -e 's/|$//' -e 's/^|//' -e 's/^/^/' -e 's/$/$/' -e 's/|/$|^/g')"
echo "--2 ${cust}"

设置IFS的组合,因此它包含逗号并将$args传递给printf,而不会在其周围添加任何引号,从而消除了间距和逗号中的奇怪现象。唯一排序可以在一个操作中完成。然后使用|符号替换所有换行符,然后使用sed删除任何前导或尾随|,添加前导^和尾随$以及中间符号$|^个序列。然后回显结果字符串。

当脚本可执行并调用x37.sh时,它会生成:

$ ./x37.sh aa1, aa3,aa2 aa1 , a0
--2 ^a0$|^aa1$|^aa2$|^aa3$
$

如果没有tr命令,有很多方法可以做,sed进行行连接。