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' 被嵌入这里,它甚至没有做 对值进行 sort 或 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$
在 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
进行行连接。
框 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' 被嵌入这里,它甚至没有做 对值进行 sort 或 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$
在 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
进行行连接。