我有一个具有以下格式的字符串:
A B C D
如何在一列中具有相同的模式?
答案1
从此字符串开始:
s='A B C D'
如果我们想让它作为一列打印,我们可以使用 bash:
$ echo "${s// /$'\n'}"
A
B
C
D
或者,使用sed
:
$ sed 's/ /\n/g' <<<"$s"
A
B
C
D
或者,使用tr
:
$ tr ' ' '\n' <<<"$s"
A
B
C
D
或者,使用awk
:
$ awk '$1==$1' RS=' ' ORS='\n' <<<"$s"
A
B
C
D
或者,使用grep
:
$ grep -o '[[:alpha:]]' <<<"$s"
A
B
C
D
答案2
$ printf '%s\n' A B C D
A
B
C
D
该printf
命令是大多数 shell 中的内置命令,它采用包含一个或多个占位符的格式化字符串。该%s
字符串是“字符串”的占位符(这是 shell 中最常见的字符串)。如果给出了更多参数,printf
那么格式字符串中就有占位符(如本例所示),整个格式字符串将被一次又一次应用,直到参数列表用完。由于\n
格式字符串的末尾有一个(换行符),因此您将在自己的行上得到每个字母。
如果变量中有字符串:
str='A B C D'
printf '%s\n' $str
这将得到与上面相同的结果。扩展$str
是不带引号的,这意味着字符串的内容将在空格上拆分(变量中的字符IFS
将用于将字符串拆分为单词,并且该变量默认包含空格、制表符和换行符)。请注意,如果字符串包含文件名通配字符,例如*
,则将输出与这些模式匹配的文件名。通过设置noglob
shell 选项(使用set -f
或set -o noglob
),您可以避免这种情况:
str='A B C D *'
set -f
printf '%s\n' $str
set +f