Shell 如何使用grep命令确定字符串是否包含换行符?
假设我们有一个包含换行符的变量“test”,例如,Shell 如何使用grep命令确定字符串是否包含换行符?,shell,unix,scripting,grep,Shell,Unix,Scripting,Grep,假设我们有一个包含换行符的变量“test”,例如,\n。如果我使用以下命令: echo "$test" | grep '\n' 结果不是我所期望的。上面的grep命令仅搜索测试字符串是否包含字符“n”,而不是换行符“\”之后的换行符 我应该如何编写grep命令来搜索特定字符串中的换行符? 仅供参考,以下内容也不正确 echo "$test" | grep '^.*$' 通过使用grep的-c选项来计算与此匹配的行,可以实现。注意$字符与行尾匹配,而不是\n还可以查看$test周围的双引号对于
\n
。如果我使用以下命令:
echo "$test" | grep '\n'
结果不是我所期望的。上面的grep
命令仅搜索测试字符串是否包含字符“n”,而不是换行符“\”之后的换行符
我应该如何编写grep命令来搜索特定字符串中的换行符?
仅供参考,以下内容也不正确
echo "$test" | grep '^.*$'
通过使用grep的
-c
选项来计算与此匹配的行,可以实现。注意$
字符与行尾匹配,而不是\n
还可以查看$test
周围的双引号对于保留换行符的重要性
test="one
two
three"
echo $test | grep -c '$'
1
echo "$test" | grep -c '$'
3
您还可以通过使用-c
选项对^
行的开头或*
任何内容进行测试,或者如您的问题所示,对整行^.*$
进行测试
如何关于测试多行变量的
wc
wc-l
打印换行计数:
echo "$test" | wc -l
3
除了换行符
之外,您还可以使用wc
分别使用wc-m
和wc-w
对文件(或变量/stdout)中的字符和单词进行计数
或使用tr
将\n
替换为变量中不包含的唯一字符,例如:
echo "$test" | tr '\n' '_'
one_two_three_
然后,您可以对替换的字符执行grep
,在本例中为\uu
或即使使用cat-E
echo "$test" | cat -E
one$
two$
three$
cat-E
或-show ends
在每行末尾显示$
。一般来说,grep
通常不是查找换行符的正确工具。它最初的设计是读取一行,看看该行是否与模式匹配(虽然$
在行尾匹配,但实际匹配的不是新行)。诚然,GNUgrep
可以做各种额外的技巧,但它仍然有一种“一次一行”的心态。作为输出,你到底想要什么?变量包含的行?行数的计数?只包含换行符而不包含其他内容的行?第二个grep
命令的输出有什么问题。如果变量$test
中有三行,它将选择三行,如果grep
可以处理换行符,这就是您的第一个命令所做的。@Jonathan Leffler我想知道的是$test是否包含换行符。如果[$(echo“$test”| wc-l)-gt 2];然后:测试包含换行符;fi
@JonathanLeffler@eleven考虑了如何使用grep
和cat
实现这一点,尽管wc
仍然是计算行数的最佳解决方案。@BeniBela:哪个文件?或者您正在考虑一个非常大的变量字符串?你确定额外流程和管道的成本会是净节约吗?@BeniBela我想这取决于OP想要什么,测试至少一个\n
或计算多少。。。(和@JonathanLeffler point)。如果$test有一些“\u”字符,它将fail@sudo_o如果$test有一些“\u1”字符,它将fail@eleven是的,在这种情况下,你必须使用不同的字符,也许我不应该认为这是给定的。答复更新:)