在bash中解析文本我经常需要将一组参数转换为输出文件的行。
例如,如果我跑:
theBinaryIamLookingFor "arg1" "arg2" "argument with some words"
我想得到以下输出:
arg1
arg2
argument with some words
我显然需要大多数发行版的原生解决方案,否则我知道该怎么做。
我的主要目标是优化和清理我通常用循环组成的代码。
这可能是一个愚蠢的问题,但是在网上使用非常常用的关键词(新行,参数......)进行搜索是很难的。
答案 0 :(得分:2)
仅使用POSIX sh标准指定的功能:
printf '%s\n' "arg1" "arg2" "argument with some words"
如果你想确保每个参数只打印一行,即使参数包含文字换行符,也可以考虑使用bash / ksh / zsh扩展名printf %q
(这也会产生非ASCII字符和其他内容您的终端可能无法呈现可见的内容),以shell将eval
恢复为其原始值的方式格式化内容:
printf '%q\n' "arg1" "arg2" "argument with some words"
要了解这一点很重要,请考虑"arg1" "arg2" "argument with"$'\n'"a newline"
。
相比之下,如果您的目标是以一种易于解析为最初作为输入提供的完全相同的参数列表的方式生成输出,而不使用eval
等不安全的实践,则使用NUL而不是换行符作为格式字符串'%s\0'
的分隔符;这些是安全的,因为命令行参数是作为C字符串给出的,而C字符串是NUL分隔的,NUL是(唯一!)字符,它不能存在于参数的文本中(因此可以安全地用来划分它们。)