在Bash中插入变量中的换行符
1. 概述
我们可以想象需要在变量中插入换行符的情况。例如,对于任何需要文本格式的任务,生成要运行的命令列表。 出于这个原因,在本教程中,我们将举例说明如何在 bash 中将换行符插入到变量中。
2. 显示已经格式化的文本
首先,我们想简要介绍一下用换行符显示文本的可能性。 假设我们有带有换行符的文本。鉴于让我们尝试使用echo :
$ text="first \nsecond \nthird"
$ echo $text
first \nsecond \nthird
正如我们所见,\n序列未被识别为新行。
2.1. echo -e命令
为了能够识别特殊字符序列,例如换行符*\n*,我们可以使用带有特殊选项*-e的echo*:
$ text="first \nsecond \nthird"
$ echo -e $text
first
second
third
这一次我们已经实现了我们想要的,并且单词换行了。
2.2. printf命令
使用printf 我们可以完成与使用echo -e相同的结果:
$ text="first \nsecond \nthird"
$ printf %b $text
first
second
third
2.3. 带有换行符的文本
让我们考虑一下当我们有一个带有换行符的文本时的情况:
$ text="first
second
third"
$ echo "$text"
first
second
third
正如我们所看到的,当我们处理包含插入换行符的文本时,我们也可以根据需要显示文本。但是,让我们注意我们必须用括号包裹变量,否则它不会显示带有新行的文本。
2.4. Shell参数扩展
此外,我们可以通过参数扩展来操作文本。 为此,我们需要在所有出现的*\n之前添加$*运算符:
$ text="first "$'\n'"second "$'\n'"third"
$ echo "$text"
first
second
third
3. 自动在文本中添加换行符
在上一节中,我们展示了如何显示和格式化文本以打印新行。但是,在实际示例中,具有预处理文本并根据指定规则添加换行符的能力可能非常有用。因此,我们准备了一些如何在文本中设置新行的示例。
3.1. 顺序添加换行符
假设我们想在文本中插入换行符而不是空格,我们之前用作示例。因此,我们可以例如遍历每个世界并插入我们在上一节中已经知道的特殊序列字符之一:
$ text="first second third"
$ for word in $text
$ do
$ p+="$word"$'\n'
$ done
$ echo "$p"
first
second
third
正如我们所见,它很好用!
3.2. 添加换行符而不是所选字符
但是如果我们想添加一个换行符而不是“;”呢?或除空格以外的任何其他字符?出于这个原因,我们必须稍微修改一下我们之前的脚本:
$ text="first ; second ; third"
$ IFS=";"
$ for word in $text; do
> p+="$word"$'\n'
> done
$ echo "$p"
first
second
third
完美的!所以现在我们知道如何在变量中存储换行符,也知道如何操作任何文本或命令序列来在我们想要的任何地方插入换行符。
3.3. 使用tr 命令
我们可以使用更方便的东西,而不是遍历文本中的所有单词。因此,对于我们的目的而言,tr 将是一个完美的选择:
$ text="first second third"
$ echo $text | tr " " "\n"
first
second
third
伟大的!结果与我们使用循环时的结果相同,但这次我们将所有内容放在一行中。
4. 将文件中的文本分配给变量
现在假设我们想使用存储在文件中的文本。出于这个原因,使用先前提供的命令没有任何障碍。但是,在处理文件中的文本时,我们首先想到的是sed命令。
4.1. 使用sed命令
当然,结合echo的sed 命令也可以用于我们使用分配给变量的文本的示例。但是为了使其优雅而不需要编写多于一行的代码,我们使用sed准备了示例:
$ cat text.txt
one two three four five six
$ text=$(sed 's/ /\n/g' text.txt)
$ echo $text
one
two
three
four
five
six
很棒,只需要一行代码,我们就可以从文件中读取文本,插入换行符而不是空格(当然我们可以将任何字符交换到换行符),并将其分配给一个变量。
4.2. awk命令
我们认为拥有更多选择总是更好。考虑到这一点,我们想再举一个在变量中插入换行符的例子:
$ cat text.txt
one two three four five six
$ text=$(awk '{gsub(/ /,"\n")}1' text.txt)
$ echo $text
one
two
three
four
five
six
它的工作与sed几乎相同,但awk 有很多附加功能,这可能对我们非常有用。