如何在 bash 数组的所有条目中用下划线替换空格
How to substitute spaces with underscores in all entries in a bash array
我试图用一个文件夹中的文件填充一个数组,但如果它们的名称中有空格,它们将被拆分并且该数组将填充单个单词。
这是我尝试用下划线替换空格的代码:
array=($(ls)) | sed -r 's/ /_/g'
如何将ls项记录到bash数组中?
array=( * ) # populate array with filenames
array=( "${array[@]// /_}" ) # convert spaces to underscores in all array elements
说明:
array=( $(ls) )
不能安全使用:未转义的扩展会扩展 glob(如果你有一个名为 *
的文件,它将被其他名称的列表替换)并在全白色上拆分默认情况下 space(意味着名为 two words
的文件将成为两个数组条目,第一个是 two
,第二个是 words
)。此外,ls
对不可打印字符的行为是未定义的,它的包含文字换行符的文件的输出必然是模棱两可的。
"${foo// /_}"
是 shell 变量 foo
的扩展,所有 space 都替换为下划线。 (${foo/ /_}
只会用下划线替换第一个 space)。对于数组,应用通常的语法更改:${foo[@]// /_}
。 BashFAQ #100 (How do I do string manipulations in bash?). 中全面描述了此语法
我试图用一个文件夹中的文件填充一个数组,但如果它们的名称中有空格,它们将被拆分并且该数组将填充单个单词。 这是我尝试用下划线替换空格的代码:
array=($(ls)) | sed -r 's/ /_/g'
如何将ls项记录到bash数组中?
array=( * ) # populate array with filenames
array=( "${array[@]// /_}" ) # convert spaces to underscores in all array elements
说明:
array=( $(ls) )
不能安全使用:未转义的扩展会扩展 glob(如果你有一个名为*
的文件,它将被其他名称的列表替换)并在全白色上拆分默认情况下 space(意味着名为two words
的文件将成为两个数组条目,第一个是two
,第二个是words
)。此外,ls
对不可打印字符的行为是未定义的,它的包含文字换行符的文件的输出必然是模棱两可的。"${foo// /_}"
是 shell 变量foo
的扩展,所有 space 都替换为下划线。 (${foo/ /_}
只会用下划线替换第一个 space)。对于数组,应用通常的语法更改:${foo[@]// /_}
。 BashFAQ #100 (How do I do string manipulations in bash?). 中全面描述了此语法