在 shell 中如何分割字符串与合并多行文本 · 今日 | 您所在的位置:网站首页 › shell拼接字符串变量不对怎么办 › 在 shell 中如何分割字符串与合并多行文本 · 今日 |
在高级程序语言中,基本都提供了丰富的字符串操作功能函数,一般都包含名称为或类似于String 的类或标准库中。 在 shell 这款诞生于几十年前、语言特性并无跟随现代化演进的脚本语言上,要实现类似于现代高级程序语言中 String 的合并分割功能,并没有可直接使用的 split 或 join 函数。那么有没有变通和实现方法呢? 其实,在 SHELL 实现诸如字符串的 split 和 join 操作,有非常多的方法。 字符串分割 string spliting #在 shell 中,在字符串进行分割,有两种思路。一是使用 shell 脚本的语言特性,二是使用 *nix 系统带的命令行工具。 使用字符替换来分割字符串 #tr 或者 类似实现字符串替换的工具,如 sed。 echo "go:python:rust:js" | tr ":" "\n"使用 tr 将分隔符 : 替换成换行符 \n。 输出:
使用 cut 对输入字符串进行切割。如上所述,它有比较明显的缺点,需要指定哪一个列,如果输入多列,那么需要多次执行命令。不过,当字符串很短的情况下,这些差异可以忽略。 输出:
使用 awk 处理输入字符串,通过指定输入列分隔符( FS=":" )、与输出列分隔符(OFS="\n")来实现。特别需要指出的,在上面的示例脚本中,{$1=$1} 是必要的,它告诉awk 强行重新格式化行数据,不然不会有什么效果。 输出:
IFS,全称为 Internal Field Separator。 在 zsh 中, # zsh IFS=":" read -rA aaa 1)行时,s=(s d)$0 实际为 “前N-1行合并 + 分隔符 + 第N行”(此处 + 表示字符串连接)。输出:
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 实验室设备网 版权所有 |