Skip to content

Latest commit

 

History

History
86 lines (59 loc) · 3.07 KB

指定分隔符拆分字符串.md

File metadata and controls

86 lines (59 loc) · 3.07 KB

指定分隔符拆分字符串

# sh
split() {
   # Usage: split "string" "delimiter"
   IFS=$'\n' read -d "" -ra arr <<< "${1//$2/$'\n'}"
   printf '%s\n' "${arr[@]}"
}

语法说明:

使用范例: split "aa--bb--cc--dd--n n" "--"

IFS=$'\n'

  • 此处是设置内部字段分隔符(IFS);
  • 环境变量IFS,称为内部字段分隔符(internal field separator),定义了bash shell用作字段分隔符的一系列字符。 默认情况下,bash shell会将下列字符当做字段分隔符:
    • 空格
    • 制表符
    • 换行符
  • 这里的作用是确保换行符是IFS,防止字符串中的空格被当做分隔符。

"${1//$2/$'\n'}"

  • 此句是在第一个参数中用\n换行符替换所有匹配第二个参数字段,详见${ } 的一些特异功能
  • "aa--bb--cc--dd--n n" 就变成了"aa\nbb\ncc\ndd\nn n"(注意:空格没有被替换)

<<<

  • <<<被称作Here String,是here document的一种定制形式;
  • 格式是:COMMAND <<<$WORD,$WORD将被扩展并且被送入COMMAND的stdin中;

read -d "" -ra arr

此句就是将字符串根据IFS进行分割,并将分割后的字段赋值给数组arr


环境变量IFS

那么下面三个IFS的区别是什么呢?

  • IFS='\n' // 将字符\和字符n作为IFS的换行符。
  • IFS=$'\n' // 真正的使用换行符做为字段分隔符。
  • IFS='\n':;" // 这个赋值会将反斜杠、n、冒号、分号和双引号作为字段分隔符。
----------

read命令

  • read命令用于从标准输入中读取输入单行,并将读取的单行根据IFS变量分裂成多个字段,并将分割后的字段分别赋值给指定的变量列表。
  • 如果没有指定任何存储变量,则分割后的所有字段都存储在特定变量REPLY中。
  • 选项说明
-a:将分裂后的字段依次存储到指定的数组中,存储的起始位置从数组的index=0开始。
-d:指定读取行的结束符号。默认结束符号为换行符。
-n:限制读取N个字符就自动结束读取,如果没有读满N个字符就按下回车或遇到换行符,则也会结束读取。
-N:严格要求读满N个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束。其中换行符或回车算一个字符。
-p:给出提示符。默认不支持"\n"换行,要换行需要特殊处理,见下文示例。例如,"-p 请输入密码:"
-r:禁止反斜线的转义功能。这意味着"\"会变成文本的一部分。
-s:静默模式。输入的内容不会回显在屏幕上。
-t:给出超时时间,在达到超时时间时,read退出并返回错误。也就是说不会读取任何内容,即使已经输入了一部分。
----------