gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:22 25 4
gpt4 key购买 nike

框 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,我得到以下输出,不是我期待在输出中(字符 'n' 被嵌入这里,它甚至没有对 sortuniq 操作值(value)观):

$ ./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 操作,对于这种简单的 sed 命令,两个 BASH 版本都应该为我提供相同的输出。

最佳答案

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

关于linux - BASH/sed - 不为简单的 sed 命令提供相同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41114938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com