如何使用 for 循环发现新行?

如何使用 for 循环发现新行?

在网络上的各个地方我发现:

\015 
\012
\x0a - hex
\n
\r

全部作为各种换行符/回车符的同义词...

但在这个小脚本中,当我遇到换行符时,我无法识别 - 有人可以告诉我应该在 if 行中检查什么吗?

#!/bin/bash

test="this is a
test"

for a in "$test"; do

        if [[ "$a" == '\012' ]] ; then
                echo "FOUND NEWLINE"
        fi

echo "$a"

done

答案1

如果您直接在for循环下使用字符串,它将针对每个单词工作(此处为单词:自引用以来的全部内容$test),而不是每个字符。您需要使用while循环来read逐个字母地解析,或者引入一个可以迭代字符串的数字参数。

此外,使用 时read,您需要确保换行符和空格不会被解释为分隔符,并强制read一次读取一个字符。

这是一个工作版本:

#!/bin/bash

test="this is a
test"

printf %s "$test" | while IFS= read -r -N 1 a; do

        if [[ "$a" == $'\n' ]] ; then
                echo "FOUND NEWLINE"
        fi

printf %s "$a"

done

您可以替换$'\n'$'\012'$'\x0a',因为它们都代表相同的换行代码。但它与\015or不同\r- 这代表回车(返回到行首)。在 Linux 系统上,换行符使用 表示\n,但在 Windows 上,它们由一系列 代替 表示\r\n。这就是为什么如果您有来自 Windows 的文本文件,您也可以通过搜索\r.

答案2

您可以在 bash 中轻松检查变量中的换行符:

[[ $var = *$'\n'* ]]

我觉得用起来比较方便:

declare -r EOL=$'\n' TAB=$'\t' # at top of script
..
if [[ $var = *$EOL* ]]; then # to test (no field-splitting in [[ )

答案3

我建议使用tr然后test

if [ -n "$(tr -cd '\n\r' < datafile)" ]; then
    echo "NEWLINE FOUND"
fi

删除tr -cd除换行符/回车符之外的所有内容。如果文件中有换行符,则测试将返回 true 的输出-n

相关内容