方框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命令提供相同的输出。
答案 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
进行行连接。