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

BASH / sed - not giving same output for simple sed commands

框 1:uname -srm

Darwin 16.1.0 x86_64

框 2:uname -srm;猫 /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 '2' '|'|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 '2' '|' \
        | 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 '2' '|')"
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,我得到以下输出不是 我在输出中所期望的(字符'n' 被嵌入这里,它甚至没有做 对值进行 sortuniq 操作):

$ ./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$

在 box2 上:当我做同样的事情时:我得到了预期的输出。

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

我应该更改什么以使上面的表达式在两台机器上给出相同的输出?或者- 我必须更新 box1 上的 BASH 吗?

我的理解是,我正在执行非常简单的 sed 操作,并且两个 BASH 版本应该为我提供相同的输出,以便执行如此简单的 sed 命令。

添加管道,然后删除它们,然后再重新添加它们似乎有点复杂。此代码适用于 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 '2' '|' | 
        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 进行行连接。