Arrays Bash-换线和推杆'_';数字前后

Arrays Bash-换线和推杆'_';数字前后,arrays,string,bash,shell,cut,Arrays,String,Bash,Shell,Cut,我在Bash中的第二个问题- 我有这样的路线 New York 17 Hello 1246873 548 我想得到这个: New York_17_Hello_1246873_548_ 我也可以 Hello_17_New York_123456_54_ *不管最后一个下划线是否存在, 但是,我们必须使用数组来解决这个问题,所以我想把它剪切成数组,但却被卡在中间。 有什么解决方案吗?:)您可以使用以下方法: p='New York 17 Hello 1246873 548' sed -E 's

我在Bash中的第二个问题- 我有这样的路线

New York 17 Hello 1246873 548
我想得到这个:

New York_17_Hello_1246873_548_
我也可以

Hello_17_New York_123456_54_
*不管最后一个下划线是否存在, 但是,我们必须使用数组来解决这个问题,所以我想把它剪切成数组,但却被卡在中间。 有什么解决方案吗?:)

您可以使用以下方法:

p='New York 17 Hello 1246873 548'
sed -E 's/ *([0-9]+) */_\1_/g; s/_(_[0-9]+)/\1/g' <<< "$p"

New York_17_Hello_1246873_548_
p='纽约17你好1246873 548'
sed-E的/*([0-9]+)*/\u1\ug;s/(+[0-9]+)/\1/g'Perl解决方案:

echo 'New York 17 Hello 1246873 548
Hello 17 New York 123456 54' \
    | perl -lnwe ' @f = split /(?<=[0-9]) | (?=[0-9])/;
                   print join("_", @f), $f[-1] =~ /[0-9]$/ ? "_" : "";
                 '
echo'纽约17你好1246873 548
你好17纽约12345654'\

|perl-lnwe'@f=split/(?在纯bash中,不需要外部工具(
sed
awk
)等):

s='New York 17 Hello 1246873 548'

# replace any space immediately before a digit with an underscore
while [[ $s =~ (^|[[:space:]])[[:digit:]] ]]; do
  s=${s//$BASH_REMATCH/_${BASH_REMATCH:1}}
done

# replace any space immediately after a digit with an underscore
while [[ $s =~ [[:digit:]]([[:space:]]|$) ]]; do
  s=${s//$BASH_REMATCH/${BASH_REMATCH:0:1}_}
done
…排放:

New York_17_Hello_12468_73_548_

简单的本机bash解决方案是使用参数扩展:

${variable// /_}
这会将
变量中出现的
替换为

比如说,

test="New York 17 Hello 1246873 548"
echo ${test// /_}
将输出纽约17你好1246873 548

但是,您请求了一个基于数组的解决方案。请注意,这一点特别复杂,因为
bash
非常适合处理字符串,但与数组相比就不那么复杂了

第一步是将文本拆分为一个单词数组。这很容易做到,因为文本是以空格分隔的,空格是参数的默认分隔符:

testArray=($test)
echo ${testArray[0]}
此处的回声将输出新的

现在我们需要使用
\uu
将其连接回来。既然您说您不关心尾随的
\u
,那么您可以只打印数组的每个部分,后面跟着一个
\u

for part in ${testArray[@]}; do
    echo -n "${part}_"
done
这里
${testArray[@]}
分解数组,然后
for
可以循环,并且
echo-n
输出文本而不在后面加换行符。我们需要将
$part
变量包含在
${…}
中,否则bash会将下划线理解为变量名称的一部分