Arrays Bash-换线和推杆'_';数字前后
我在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
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会将下划线理解为变量名称的一部分