Bash 子字符串检测无法检测换行符
我的代码遍历一个文本文件并对其进行一些处理。最后我在处理(缺少)新词方面遇到了麻烦。我想测试一行的末尾是否有一个换行符。如果是,我想在文件的行中添加一个换行符。现在,我的代码根本没有添加任何新行,我也不太清楚为什么 我在谷歌上搜索过,但什么都没用Bash 子字符串检测无法检测换行符,bash,shell,file,io,scripting,Bash,Shell,File,Io,Scripting,我的代码遍历一个文本文件并对其进行一些处理。最后我在处理(缺少)新词方面遇到了麻烦。我想测试一行的末尾是否有一个换行符。如果是,我想在文件的行中添加一个换行符。现在,我的代码根本没有添加任何新行,我也不太清楚为什么 我在谷歌上搜索过,但什么都没用 while read line || [ -n "$line" ]; do ...#Do things SUB="\n" if [[ "$line" =~ .
while read line || [ -n "$line" ]; do
...#Do things
SUB="\n"
if [[ "$line" =~ .*"$SUB".* ]]; then
echo "It's there."
printf "\n" >> $DEC
fi
done <ip.txt
输出:
line1(\n此处)
第2行(\n此处)
第3行(此处没有\n)
案例2:
知识产权:
Line1(\n此处)
第2行(\n此处)
第3行(\n此处)
输出:
line1(\n此处)
第2行(\n此处)
第3行(\n此处)
但我得到:
第1行(无空格)第2行(无空格)第3行
对于这两种情况,当前方法都存在两个问题。第一个是
read
从行尾删除换行符,因此无法检查换行符的结果,因为它不会出现read
如果到达文件末尾而不是换行符,将返回一个错误状态,这就是为什么需要| |[-n“$line”]
来防止循环在读取未终止的行时退出
第二个问题是SUB=“\n”
在变量中存储反斜杠和“n”;要获取换行符,请使用SUB=$'\n'
根据您在循环中尝试执行的其他操作,有许多选项。如果将缺少的换行符添加到文件的末尾是唯一的目标,那么在答案中有一系列选项
如果您需要通读这些行,在shell中处理它们,然后输出它们并在末尾添加缺少的换行符,然后只使用当前循环,并使用换行符输出每一行--您需要添加它,无论它最初是否在那里,如果您总是添加它,它将始终在那里
如果您需要明确地找出最后一行是否有换行符,如果有,则执行不同的操作,一个选项是稍微修改原始代码:
while read line; do
# process lines that had newlines at the end
done <ip.txt
if [ -n "$line" ]; then
# final line was missing a newline; process it here
fi
您当前的方法有两个问题。第一个是
read
从行尾删除换行符,因此无法检查换行符的结果,因为它不会出现read
如果到达文件末尾而不是换行符,将返回一个错误状态,这就是为什么需要| |[-n“$line”]
来防止循环在读取未终止的行时退出
第二个问题是SUB=“\n”
在变量中存储反斜杠和“n”;要获取换行符,请使用SUB=$'\n'
根据您在循环中尝试执行的其他操作,有许多选项。如果将缺少的换行符添加到文件的末尾是唯一的目标,那么在答案中有一系列选项
如果您需要通读这些行,在shell中处理它们,然后输出它们并在末尾添加缺少的换行符,然后只使用当前循环,并使用换行符输出每一行--您需要添加它,无论它最初是否在那里,如果您总是添加它,它将始终在那里
如果您需要明确地找出最后一行是否有换行符,如果有,则执行不同的操作,一个选项是稍微修改原始代码:
while read line; do
# process lines that had newlines at the end
done <ip.txt
if [ -n "$line" ]; then
# final line was missing a newline; process it here
fi
不确定我理解目标,也不知道如何在一行中的“换行”字符匹配(<代码>”$行“=**”$子“** /代码>)所以FWW…code>SUB=“\n”将为
SUB
分配一个两个字符的字符串。。。字符“\”和“n”;要分配换行符,请尝试SUB=$'\n'
我不希望这样做。在所有针对换行符的谷歌解决方案都不起作用之后,我只是检查了子字符串检测。我想应该是这样work@markp-扶桑,你给我的潜艇坏了。它没有被检测到,我不确定我是否理解这个目标,也不知道如何在一行中的“换行”字符匹配(<代码>”$行“=**”$子“** /代码>),所以FWW…code>SUB=“\n”将为SUB
分配一个两个字符的字符串。。。字符“\”和“n”;要分配换行符,请尝试SUB=$'\n'
我不希望这样做。在所有针对换行符的谷歌解决方案都不起作用之后,我只是检查了子字符串检测。我想应该是这样work@markp-扶桑,你给我的潜艇坏了。它不会被发现你很快!刚在读行时测试了;i=1;完成<你很快!刚在读行时测试了;i=1;完成<