新手UNIX用户问题..。
输入文件(location.txt)如下:
WGS_LAT deg 12
WGS_LAT min 30
WGS_LAT sec 05
WGS_LAT hsec 29
WGS_LAT northSouth North
WGS_DLAT decimalDegreesLatitude 12.501469
WGS_LONG deg 07
WGS_LONG min 00
WGS_LONG sec 05
WGS_LONG hsec 61
WGS_LONG eastWest West
WGS_DLONG decimalDegreesLongitude -70.015606我想得到所有以WGS_LAT或WGS_DLAT开头的行。
首先,grep是您推荐的这个工作的工具吗?
第二,如果是的话,那么如何表达模式呢?所有这些都失败了:
grep ^WGS_LAT|^WGS_DLAT location.txt
grep ^(WGS_LAT|WGS_DLAT) location.txt
grep ^WGS_D?LAT location.txt请问正确的图案是什么?
发布于 2022-10-09 11:10:49
首先,您应该始终引用正则表达式,以保护它们不受shell的影响。例如,|在shell中具有特殊意义,它是管道操作符,它允许您将一个程序的输出作为输入传递给另一个程序。因此,未引用的grep ^WGS_LAT|^WGS_DLAT location.txt被解释为“运行grep ^WGS_LAT并将其输出作为输入传递给^WGS_DLAT location.txt。
接下来,grep默认使用基本正则表达式,为了使|表示OR,您需要将其转义为\|,或者使用-E (如果您使用的是启用PCRE的GNUgrep)来启用扩展正则表达式。所以所有这些都适用于你:
grep -E '^WGS_LAT|^WGS_DLAT' location.txt
grep -E '^(WGS_LAT|WGS_DLAT)' location.txt
grep '^WGS_LAT\|^WGS_DLAT' location.txt或者,更简单地说,grep用于以WGS_开头的行和一个可选的D,后面跟着LAT
grep -E '^WGS_D?LAT' location.txt发布于 2022-10-09 11:09:04
Grep可以处理两种类型的正则表达式:
grep PATTERN file调用的基本正则表达式(BRE)grep -E PATTERN file调用的扩展正则表达式(ERE)因此,在默认情况下,grep使用BRE。
当阅读grep的手册页时,您会发现
Basic表达式与扩展正则表达式在基本正则表达式中元字符
?、+、{、|、(和)失去了特殊意义;相反,请使用反斜杠版本\?、\+、\{、\|、\(和\)。
因此,就你的情况而言,答案是:
$ grep "^\(WGS_LAT\|WGS_DLAT \)" location.txt
$ grep -E "^(WGS_LAT|WGS_DLAT)" location.txt
$ grep "^WGS_D\?LAT" location.txt
$ grep -E "^WGS_D?LAT" location.txthttps://stackoverflow.com/questions/74004080
复制相似问题