shell 中的通配符和正规表示法(正则表达式)

本文详细介绍了Shell中的通配符及其用途,并解释了正规表示法(正则表达式)的基本概念与特殊符号的意义,帮助读者理解如何在Shell环境中进行高效的字符串处理。
shell 中的通配符与特殊符号
*     代表『 0 个或者无穷多个』任意字符 
?     代表『一定有一个』任意字符 
[ ]    同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[-]    若有减号在中括号内时,代表『在编码顺序内癿所有字符』。例如 [0-9] 代表 0 刡 9 之间的所有数字,因为数字的语系编码是连续的!
[^]   若中括号内癿第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,叧要是非 a, b, c 的其他字符就接受的意思。
#     批注符号:这个最常被使用在 script 当中,规为说明!在后的数据均不执行。注释
\      跳脱符号:将『特殊字符戒通配符』还原成一般字符
|      管线 (pipe):分割两个管线命令的界定
;      连续指令下达分割符:连续性命令的界定
~     用户家目录
$     取用变数前导符:亦即是变量之前需要加的变量取代值。上次命令返回值,0是执行成功
&    工作控制 (job control):将指令发成背景下工作 
!      逻辑运算意义上的『非』
/      目录符号:路径分割的符号
<  <<    数据重定向,输入导向
>  >>    数据重定向,输出导向,分别是取代和追加
''       单引号不具备变量置换功能
""     具有变量置换功能
``     两个『 ` 』中间为可以先执行 的指令,亦可使用 $( )
()     在中间为子 shell 的起始与结束
{}     在中间为命令区块的组合


正规表示法(正则表达式)

处理字符串的方法,他是以行为单位来进行字符串的处理行为。透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字符串的处理程序!


.       一定有一个任意字符(除换行以外)
*      重复前一个字符0到无穷多次    (通配符表示 0到任意多个字符)
{}      一定范围区间重复字符。{} 在shell 中有特别的含义,使用时要转换。如:$last | grep -n 'o\{1,\}'
^      行首
$      行尾
\       转义
[] [a-z]    选一个
[^a-z]     取反

注意和通配符的区别。在不支持正规表示法的命令(工具)中,则是通配符的使用。

延伸正规表示法(不适用sed 适用于gawd等扩展的)
如:除去文档的注释和空白行
gerp -v '^#' file_name | grep -v '^$' 使用延伸正规表示法:
egrep -v '^$|^#' file_name  (也可以用grep -E , grep 不直接支持延伸正规表示法)
延伸正规表示法,可以透过群组功能( |  管线命令) 进行一次搜索,’ | ‘ 在单引号内是 or 的意思 

延伸正规表示法就是多了几个特殊符号。
+     重复一个或以上前一个字符,o+ 代表一个以上个o
?     零个或1个
|      or 的意思 ,如找gd 或者 good : egrep -n 'gd|good' file_name   
()    找出群组字符,
()+  多个群组(重复)
<think>首先,用户的问题是:如何用正则表达式从"geoCoord:[103.73,36.03]"中提取103.7336.03。我需要使用正则表达式来匹配提取这些数值。数值是浮点数,有小数点。回想正则表达式的基本元素:-数字:`\d`匹配单个数字。-小数点:`.`需要转义,因为`.`在正则中是通配符,所以用`\.`。-多个数字:`\d+`匹配一个或多个数字。-可选的小数部分:可以用`\d*\.\d+`或`\d+\.\d*`匹配浮点数。但这里数值有整数小数部分,所以`\d+\.\d+`可能合适。在字符串"geoCoord:[103.73,36.03]"中,我需要提取两个数字:103.7336.03。正则表达式应该匹配整个模式:-开头是"geoCoord:[",然后是第一个数字,逗号,空格,第二个数字,最后是"]"。为了提取数字,我可以使用捕获组(capturinggroups)。在正则表达式中,用括号`()`创建捕获组。所以,一个可能的正则表达式是:`geoCoord:\[(\d+\.\d+),\s*(\d+\.\d+)\]`解释:-`geoCoord:\[`:匹配字面字符串"geoCoord:["-`(\d+\.\d+)`:第一个捕获组,匹配浮点数,如103.73-`,`:匹配逗号-`\s*`:匹配零个或多个空白字符(包括空格)-`(\d+\.\d+)`:第二个捕获组,匹配第二个浮点数-`\]`:匹配闭括号在Python中,我可以使用`re`模块来演示。用户提到了一些引用,但我需要关注问题。引用[1]是关于grep命令的,引用[2]是关于JavaScript正则表达式的例子,引用[3]是关于shell脚本的。这些可能不是直接相关的,但可以作为参考。用户说“上述引用仅供参考”,所以我应该基于问题回答。我的回答需要:-使用中文-结构清晰-生成相关问题-在回答中自然地添加引用标识(但这里没有外部引用,可能不需要)-对于数学表达式,用$...$或$$...$$,但这个问题不涉及数学,所以可能不需要。问题涉及正则表达式,不是数学,所以LaTeX数学格式可能不适用。但如果有数字表达式,我可以考虑,但这里直接是字符串处理。步骤:1.解释正则表达式的构建。2.给出示例代码(Python或其他语言)。3.提取数字。用户没有指定编程语言,但引用中提到了Python(在快速排序示例),以及shellJavaScript。我应该用Python,因为它在数据科学中常用。在Python中使用`re.findall`或`re.search`。正则表达式:`geoCoord:\[(\d+\.\d+),\s*(\d+\.\d+)\]`但数字可能有负号?在用户例子中是正数,所以暂时不考虑负号。用户例子是103.7336.03,都是正浮点数。为了健壮性,可以允许负号:`-?\d+\.\d+`,但用户没有提到负号。在捕获组中:`(-?\d+\.\d+)`但用户字符串中没有负号,所以可以省略。代码示例:```pythonimportretext="geoCoord:[103.73,36.03]"pattern=r'geoCoord:\[(\d+\.\d+),\s*(\d+\.\d+)\]'match=re.search(pattern,text)ifmatch:lat=match.group(1)#第一个数字,如103.73lon=match.group(2)#第二个数字,如36.03print(f"Latitude:{lat},Longitude:{lon}")else:print("Nomatchfound.")```这将提取103.7336.03。使用`re.findall`也可以,但`re.search`更直接,因为只有一个匹配。输出:Latitude:103.73,Longitude:36.03但用户可能想要数字而不是字符串,所以可以转换为float。在代码中:lat=float(match.group(1))现在,回答结构:-先解释正则表达式。-然后给出代码示例。-确保使用中文。最后,生成相关问题。相关问题:1.如何用正则表达式提取其他格式的坐标?2.如果geoCoord中的值有负号怎么办?3.正则表达式在数据清洗中的应用?4.如何批量提取多个geoCoord值?引用:用户提供了引用,但在这个问题中,没有直接相关的引用。引用[2]有正则表达式例子,我可以参考。在回答中,自然地添加引用标识。例如,如果提到浮点数匹配,可以参考引用[2]。但引用[2]是JavaScript代码,有浮点数匹配:`/^\d+\.\d+$/`,类似。所以,我可以说:参考引用[2],其中展示了浮点数的正则表达式模式。同样,引用[1]是关于grep的,但用户问题不是grep。回答组织:1.直接回答问题:使用正则表达式提取数字。2.给出正则表达式模式。3.提供代码示例(Python)。4.解释。5.生成相关问题。</think>### 正则表达式提取经纬度值 要从字符串 `geoCoord:[103.73, 36.03]` 中提取经纬度值(如 103.73 36.03),可以使用正则表达式匹配浮点数模式。以下是详细步骤解释: #### 正则表达式设计 1. **目标模式分析**: - 字符串固定前缀:`geoCoord:[` - 第一个浮点数:如 `103.73`(可能包含整数小数部分) - 分隔符:逗号可选空格(`, `) - 第二个浮点数:如 `36.03` - 字符串后缀:`]` 2. **正则表达式构建**: - 浮点数匹配:使用 `\d+\.\d+` 匹配整数小数部分(例如 `103.73`)。这里 `\d+` 表示一个或多个数字,`\.` 转义小数点。 - 捕获组:用 `()` 包裹浮点数部分,以便提取值。 - 完整正则表达式:`geoCoord:\[(\d+\.\d+),\s*(\d+\.\d+)\]` - `geoCoord:\[`:匹配固定前缀。 - `(\d+\.\d+)`:第一个捕获组(提取经度)。 - `,\s*`:匹配逗号零个或多个空格。 - `(\d+\.\d+)`:第二个捕获组(提取纬度)。 - `\]`:匹配后缀。 此模式直接提取两个浮点数,忽略无关字符[^2]。 #### 代码示例(Python) 以下 Python 代码演示如何提取并转换经纬度值: ```python import re # 输入字符串 text = "geoCoord:[103.73, 36.03]" # 正则表达式匹配 pattern = r'geoCoord:\[(\d+\.\d+),\s*(\d+\.\d+)\]' match = re.search(pattern, text) if match: longitude = float(match.group(1)) # 提取第一个浮点数(经度) latitude = float(match.group(2)) # 提取第二个浮点数(纬度) print(f"经度: {longitude}, 纬度: {latitude}") else: print("未匹配到有效坐标") ``` **输出**: ``` 经度: 103.73, 纬度: 36.03 ``` **解释**: - `re.search` 搜索字符串中的匹配项。 - `match.group(1)` `match.group(2)` 获取捕获组的值。 - `float()` 将字符串转换为浮点数。 - 此方法适用于标准浮点数格式(如用户示例),若数据包含负号或科学计数法,需调整正则表达式[^2]。 #### 其他语言示例 - **JavaScript**(参考引用[2]): ```javascript const text = "geoCoord:[103.73, 36.03]"; const pattern = /geoCoord:\[(\d+\.\d+),\s*(\d+\.\d+)\]/; const match = text.match(pattern); if (match) { const longitude = parseFloat(match[1]); const latitude = parseFloat(match[2]); console.log(`经度: ${longitude}, 纬度: ${latitude}`); } ``` - **Shell/grep**(参考引用[1]): ```bash echo "geoCoord:[103.73, 36.03]" | grep -oE '\[[0-9]+\.[0-9]+, [0-9]+\.[0-9]+\]' | sed 's/\[//;s/\]//' | awk -F', ' '{print "经度:", $1, "纬度:", $2}' ``` ### 注意事项 1. **健壮性**: - 若坐标可能含负号(如 `-120.5`),修改正则表达式为 `geoCoord:\[(-?\d+\.\d+),\s*(-?\d+\.\d+)\]`(添加 `-?` 匹配可选负号)。 - 若数字格式不规则(如无小数点),需调整模式(例如 `\d+(\.\d+)?` 匹配整数或浮点数)。 2. **性能**:此正则表达式在简单字符串中高效,适用于批量处理(如日志文件清洗)[^2]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值