在 shell 中如何分割字符串与合并多行文本 · 今日 您所在的位置:网站首页 shell拼接字符串变量不对怎么办 在 shell 中如何分割字符串与合并多行文本 · 今日

在 shell 中如何分割字符串与合并多行文本 · 今日

2024-06-24 21:00| 来源: 网络整理| 查看: 265

在高级程序语言中,基本都提供了丰富的字符串操作功能函数,一般都包含名称为或类似于String 的类或标准库中。

在 shell 这款诞生于几十年前、语言特性并无跟随现代化演进的脚本语言上,要实现类似于现代高级程序语言中 String 的合并分割功能,并没有可直接使用的 split 或 join 函数。那么有没有变通和实现方法呢?

其实,在 SHELL 实现诸如字符串的 split 和 join 操作,有非常多的方法。

字符串分割 string spliting #

在 shell 中,在字符串进行分割,有两种思路。一是使用 shell 脚本的语言特性,二是使用 *nix 系统带的命令行工具。

使用字符替换来分割字符串 #

tr 或者 类似实现字符串替换的工具,如 sed。

echo "go:python:rust:js" | tr ":" "\n"

使用 tr 将分隔符 : 替换成换行符 \n。

输出:

使用 tr 分割字符串 使用 tr 分割字符串

使用 cut 分割字符串 #echo "go:python:rust:js" | cut -d ":" -f 1 echo "go:python:rust:js" | cut -d ":" -f 2 echo "go:python:rust:js" | cut -d ":" -f 3 echo "go:python:rust:js" | cut -d ":" -f 4

使用 cut 对输入字符串进行切割。如上所述,它有比较明显的缺点,需要指定哪一个列,如果输入多列,那么需要多次执行命令。不过,当字符串很短的情况下,这些差异可以忽略。

输出:

使用 cut 分割字符串 使用 cut 分割字符串

使用 awk 分割字符串 #echo "go:python:rust:js" | awk -F":" 'BEGIN {OFS="\n"} {$1=$1} {print $0}' # 或者 echo "go:python:rust:js" | awk 'BEGIN {FS=":"; OFS="\n"} {$1=$1; print $0}'

使用 awk 处理输入字符串,通过指定输入列分隔符( FS=":" )、与输出列分隔符(OFS="\n")来实现。特别需要指出的,在上面的示例脚本中,{$1=$1} 是必要的,它告诉awk 强行重新格式化行数据,不然不会有什么效果。

输出:

使用 awk 分割字符串 使用 awk 分割字符串

使用 IFS 环境变量 #

IFS,全称为 Internal Field Separator。

在 zsh 中,

# zsh IFS=":" read -rA aaa 1)行时,s=(s d)$0 实际为 “前N-1行合并 + 分隔符 + 第N行”(此处 + 表示字符串连接)。

输出:

使用 awk 行拼接合并多行 使用 awk 行拼接合并多行

使用 printf 格式化函数合并多行 ## bash strings="go python rust js " aaa=(`echo $strings`) printf "%s, " "${aaa[@]}" # '@' not '*' echo; printf "%s, " "${aaa[*]}" # 不起作用

printf 函数的使用方法与 awk printf 函数类似,它也与现代高级程序语言的 string.format 方法雷同。这个 printf 命令行工具,可以接收多个参数,如printf "%s," hello world,会输出 hello,world,。printf 并不会为输出的结尾添加一个换行结束符,所以在你的终端里执行时,结尾会提示 “EOF”。对于本例想演示的功能,这个问题并不会造成影响。在 bash 与 zsh 中都有相同的用法。需要另外说明的,

这个方法对于行文本中包含 空格 时,会失效,问题在于 aaa=( $(echo $strings) ) ,不能按我们预期那样按换行隔断,空格会被认为是数组元素的分隔符。 printf "%s, " "${aaa[@]}" ,输入的参数为 ${aaa[@]},而不是 "${aaa[*]},区别在于 @ 是将数组展开为多个参数,而 * 表示数组展开后做为一个整体。你自己可以试一试这个差异如何体现。 # zsh strings="go python rust js " # 1. use echo # aaa=(`echo $strings`) # 2. use


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有