linux shell split 字符串,关于bash:如何在shell中分割字符串并获取最后一个字段

假设我有字符串1:2:3:4:5,我想获取它的最后一个字段(在本例中为5)。 如何使用Bash做到这一点? 我尝试了cut,但是我不知道如何用-f指定最后一个字段。

您可以使用字符串运算符:

$ foo=1:2:3:4:5

$ echo ${foo##*:}

5

贪婪地修剪从前到':'的所有内容。

${foo  

##  

*    

:    

}

尽管这对于给定的问题有效,但如果字符串为1:2:3:4:5:(使用字符串运算符时将产生空结果),下面的William(stackoverflow.com/a/3163857/520162)的答案也会返回5。这在解析可能包含(或不包含)后缀字符的路径时特别方便。

那么您将如何做相反的事情?回声1:2:3:4 :?

以及如何将零件保留在最后一个分隔符之前?显然是使用${foo%:*}。 #-从头开始; %-从头开始。 #,%-最短匹配; ##,%%-最长匹配。

如果我想从路径中获取最后一个元素,应该如何使用? echo ${pwd##*}不起作用。

@Putnik,该命令将pwd视为变量。尝试dir=$(pwd); echo ${dir##*}。为我工作!

@Stephen如何使用点(。)作为定界符?

谢谢,它解决了我的问题。我被困了2天

另一种方法是在cut之前和之后进行反转:

$ echo ab:cd:ef | rev | cut -d: -f1 | rev

ef

这样很容易获得最后一个字段,或者从末尾开始编号的任何范围的字段。

这个答案很好,因为它使用了cut(作者可能已经很熟悉)了。另外,我喜欢这个答案,因为我正在使用cut并有这个确切的问题,因此可以通过搜索找到该线程。

供使用空格作为定界符的人使用的一些剪切粘贴的饲料:echo"1 2 3 4" | rev | cut -d"" -f1 | rev

转速|切-d -f1 |转速是如此高明!谢谢!帮助了我很多(我的用例是rev | -d -f 2- | rev

我总是忘记了rev,这正是我所需要的! cut -b20- | rev | cut -b10- | rev

我最终得到了这个解决方案,我尝试用" awk -F" /" {print $ NF}"剪切文件路径对我来说有点中断,因为包括空格在内的文件名也被分割了

注意:rev对于多字节Unicode字符不安全!因此,某些特殊情况可能不适用于rev。

@ t0r0X:确定吗?在使用LC_ALL=en_US.utf8的计算机上,正确运行echo h | rev会返回h。我必须运行echo h | LC_ALL=C rev来得到错误:rev: stdin: Invalid or incomplete multibyte or wide character。

除了:在我的NAS上,-sh: rev: command not found似乎不是很普遍,否则,我同意它可以更好地解决关于割伤的问题

太棒了!我只想从域名中获取顶级域名和二级域名。借助cut,我可以将www.google.com之类的内容转换为google.com!

使用cut很难获得最后一个字段,但是这是awk和perl中的(一组)解决方案

$ echo 1:2:3:4:5 | awk -F: '{print $NF}'

5

$ echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]'

5

此解决方案相对于已接受答案的巨大优势:它也匹配包含或不包含修饰符的路径:在处理pwd | awk -F {print $NF}时,abcd和abcd产生相同的结果(d)。在abcd的情况下,可接受的答案导致结果为空

@eckes在AWK解决方案的情况下,在GNU bash上,版本4.3.48(1)-release并不正确,因为无论是否有斜杠都很重要。简单地说,AWK将使用作为定界符,如果您的路径是mypathdir,它将使用最后一个定界符之后的值,这只是一个空字符串。因此,如果您需要像我这样做,最好避免使用斜线。

假设用法非常简单(例如,不转义分隔符),则可以使用grep:

$ echo"1:2:3:4:5" | grep -oE"[^:]+$"

5

细分-在行($)的末尾查找所有字符,而不是定界符([^:])。 -o仅打印匹配的部分。

单程:

var1="1:2:3:4:5"

var2=${var1##*:}

另一个,使用数组:

var1="1:2:3:4:5"

saveIFS=$IFS

IFS=":"

var2=($var1)

IFS=$saveIFS

var2=${var2[@]: -1}

还有一个数组:

var1="1:2:3:4:5"

saveIFS=$IFS

IFS=":"

var2=($var1)

IFS=$saveIFS

count=${#var2[@]}

var2=${var2[$count-1]}

使用Bash(版本> = 3.2)正则表达式:

var1="1:2:3:4:5"

[[ $var1 =~ :([^:]*)$ ]]

var2=${BASH_REMATCH[1]}

非常感谢数组样式,因为我需要此功能,但还没有剪切,请awk这些实用程序。

$ echo"a b c d e" | tr ' ' '

' | tail -1

e

只需将定界符转换为换行符,然后使用tail -1选择最后一个条目。

如果最后一项包含,它将失败,但是在大多数情况下,这是最易读的解决方案。

使用sed:

$ echo '1:2:3:4:5' | sed 's/.*://' # => 5

$ echo '' | sed 's/.*://' # => (empty)

$ echo ':' | sed 's/.*://' # => (empty)

$ echo ':b' | sed 's/.*://' # => b

$ echo '::c' | sed 's/.*://' # => c

$ echo 'a' | sed 's/.*://' # => a

$ echo 'a:' | sed 's/.*://' # => (empty)

$ echo 'a:b' | sed 's/.*://' # => b

$ echo 'a::c' | sed 's/.*://' # => c

这里有很多好的答案,但是我仍然想使用basename共享这个答案:

basename $(echo"a:b:c:d:e" | tr ':' '/')

但是,如果字符串中已经有一些" /",它将失败。

如果斜杠/是您的定界符,那么您只需要(并且应该)使用basename。

这不是最佳答案,而只是显示了如何使用bash命令发挥创造力。

如果最后一个字段是单个字符,则可以执行以下操作:

a="1:2:3:4:5"

echo ${a: -1}

echo ${a:(-1)}

检查bash中的字符串操作。

这不起作用:它给出a的最后一个字符,而不是最后一个字段。

没错,就是这样,如果您知道最后一个字段的长度是很好的。如果不是,您必须使用其他东西...

有趣的是,我不知道这些特殊的Bash字符串操作。它也类似于Python的字符串/数组切片。

echo"a:b:c:d:e"|xargs -d : -n1|tail -1

首先使用xargs使用":"分割它,-n1表示每一行只有一部分。然后,最后一行。

尽管这可以解决问题,但应始终对其进行解释。

已经加入..

使用Bash。

$ var1="1:2:3:4:0"

$ IFS=":"

$ set -- $var1

$ eval echo  \$${#}

0

我将购买有关此方法的一些详细信息,请:-)。

可以使用echo ${!#}代替eval echo \$${#}。

for x in `echo $str | tr";""

"`; do echo $x; done

如果任何字段中都有空格,则会出现问题。而且,它没有直接解决检索最后一个字段的问题。

使用内置读取方法的解决方案:

IFS=':' read -a fields <<

echo"${fields[4]}"

或者,使其更通用:

echo"${fields[-1]}" # prints the last item

对于那些熟悉Python的人,https://github.com/Russell91/pythonpy是解决此问题的不错选择。

$echo"a:b:c:d:e" | py -x 'x.split(":")[-1]'

从pythonpy帮助中:-x treat each row of stdin as x。

使用该工具,很容易编写应用于输入的python代码。

尽管一个简单的解决方案是反转输入字符串的顺序,但答案可能会有点晚。无论长度如何,这都将使您始终获得最后一个项目。

[chris@desktop bin]$ echo 1:2:3:4:5 | rev | cut -d: -f1

5

但是,请务必注意,如果使用此方法并且数字大于1位(或在任何情况下大于一个字符),则将需要在管道输出上运行另一个" rev"命令。

[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1

42

[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1 | rev

24

希望我能帮上忙

我喜欢-很简单!

sed中的正则表达式匹配很贪心(总是到最后一次出现),您可以在这里发挥自己的优势:

$ foo=1:2:3:4:5

$ echo ${foo} | sed"s/.*://"

5

如果您喜欢python并且可以选择安装软件包,则可以使用此python实用程序。

# install pythonp

pythonp -m pip install pythonp

echo"1:2:3:4:5" | pythonp"l.split(':')[-1]"

5

python可以直接执行此操作:echo"1:2:3:4:5" | python -c"import sys; print(list(sys.stdin)[0].split(:)[-1])"

@MortenB你误会了。 pythonp包的全部目的是使您执行与python -c相同的操作,并且减少字符输入。 请查看存储库中的自述文件。

Shell脚本,有几种方法可以实现字符串分割。 一种常用的方法是使用内置命令`cut`。这个命令可以根据指定的分隔符将字符串分割成多个字段,并提取指定字段的内容。例如,假设我们有一个字符串"hello,shell,split,test",要按逗号分隔并提取第二个字段,可以使用以下命令: ``` echo "hello,shell,split,test" | cut -d ',' -f 2 ``` 另一种方法是使用内置命令`IFS`和`read`。这个方法可以将字符串按照指定的分隔符分割成多个部分,并将每个部分存储到一个变量。下面是一个示例: ```bash string="hello,shell,split,test" IFS=',' read -ra array <<< "$string" for var in "${array[@]}" do echo "$var" done ``` 这个示例,我们首先将分隔符设为逗号,然后使用`read`命令将字符串分割成多个部分,并将每个部分存储到数组`array`最后,我们使用循环遍历数组并打印每个分割后的部分。 还有其他一些方法可以实现字符串分割,比如使用`awk`命令、使用正则表达式等。具体使用哪种方法取决于你的需求和偏好。总而言之,在Shell脚本,你可以使用`cut`命令、`IFS`和`read`命令等方法来实现字符串分割。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【shellshell字符串分割|文件分割|剪切|截取](https://blog.csdn.net/bandaoyu/article/details/120659630)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Shell_Linux Shell 实现字符串切割的几种方法](https://blog.csdn.net/u010003835/article/details/80750003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值