【大数据】|大数据基础---------正则表达式及sed命令

本文深入讲解sed流编辑器的使用方法,包括基本语法、常用选项与编辑指令。涵盖行号、正则表达式的条件筛选,以及p、d、s指令的实际应用,如输出特定行、删除行和替换文本等高级技巧。

正则表达式

在这里插入图片描述

sed

流式编辑器
非交互,基于模式匹配过滤及修改文本
语法格式
sed [选项] ‘编辑指令’ 文件名

选项

  • -n:屏蔽默认输出
  • -i:直接修改文件内容
  • -r:日用扩展正则

编辑指令:条件+指令
条件:
行号
/正则/

指令:
p:输出(print)

打印第一行

sed -n '1p' passwd

打印1~4行
sed -n '1,4p' passwd

打印第三行,第五行
sed -n '3p,5p' passwd

打印第三行之后的十行
sed -n '3,+10p' passwd

打印奇数行步长
sed -n '1~2p' passwd   //1奇数  2偶数

正则

包含root的行
grep root passwd
sed -n '/root/p' passwd

以root开头的行
sed -n '/^root/p' passwd

以bash结尾的行
sed -n '/bash$/p' passwd

删除指令:d
替换指令:s

's/old/new'  替换第一个
's/old/new/'  替换第三个
's/old/new/g'  替换所有
/分隔符也可以用#、¥ 

输出行数:
sed ‘$=’ passwd

删除最后一行
sed -n ‘$d’ passwd

文本行操作:
i:行前添加文本
a:行后添加文本
c:替换指定行

修改主机名:

vim modify_hostname.sh

#!/bin/bash
//hostname liu.com
sed -i '1c   liu.com'  /etc/hostname   //1c是指令

hosts文件
本地域名解析文件
sed -l ‘1a 127.0.0.1 tedu.cn’ /etc/hosts

用户管理
命令:useradd /groupadd /userdel /groupdel
文件:
etc/passwd //用户详细信息
root❌0:0:root:/root:/bin/bash
以#作为分隔符

  1. 用户名
  2. 密码占位符
  3. UID
  4. GID
  5. 描述信息
  6. 家目录
  7. 登陆shell -s

/bin/bash :默认登陆shell,可以作为登陆用户
/sbin/nologin:非登陆shell
etc/shadow //用户的密码文件

列出bash结尾的行并存到变量中

  1. 根据此变量,for循环进行处理–以:为分分隔符从右王座最远删除
  2. 根据用户名列出对应的密码文件的行并存到变量中
  3. 根据此变量,for循环进行出路,掐头去尾获得密码信息
  4. 输出用户名–>密码信息
<think>我们有一个数据列(可能是字符串类型的列),需要将其中所有的下划线('_')替换为连字符('-')。参考引用[4]和[5]中提到了字符串替换的方法,我们可以使用类似的方法。但是要注意,我们的操作对象是数据列(比如pandasDataFrame中的一列,或者是列表等),而不是单个字符串或文件夹名。根据引用[4]中的方法,在Python中可以使用字符串的replace方法:`replace('','_')`,这里我们是把空格替换为下划线。而我们的需求是将下划线替换为连字符,所以应该是`replace('_','-')`。但是,如果我们操作的是pandasDataFrame的列,那么我们可以使用`str.replace`方法。假设我们有一个DataFrame,其中一列名为'data_column',我们可以这样操作:df['data_column']=df['data_column'].str.replace('_','-')如果我们的数据列是一个单独的列表(list),我们可以这样操作:new_list=[s.replace('_','-')forsinold_list]另外,如果数据列是其他类型(比如元组等不可变类型),需要注意转换。注意:如果数据列中可能包含缺失值(NaN),我们需要先处理缺失值,或者使用replace方法时设置参数regex=True(对于str.replace,我们也可以设置regex=False,因为这里不是正则表达式替换,但默认是True,所以用字符串替换时,最好设置regex=False以避免歧义,或者直接使用字符串替换不需要正则表达式的时候也可以直接使用)?但实际上,pandas的str.replace默认将模式视为正则表达式,但我们可以通过设置regex=False来明确表示我们使用的是普通字符串替换。所以更健壮的写法是:df['data_column']=df['data_column'].str.replace('_','-',regex=False)这样即使字符串中包含正则表达式的特殊字符,也会被视为普通字符进行替换。如果数据列不是pandas的Series,而是普通的列表,我们可以直接使用列表推导式:data=['a_b','c_d','e_f_g']new_data=[x.replace('_','-')forxindata]如果数据量很大,我们可以考虑使用map函数:new_data=list(map(lambdax:x.replace('_','-'),data))根据具体的数据结构选择合适的方法。因此,我们需要知道用户的数据结构是什么。但用户没有明确说明,所以我们给出两种常见情况:情况1:使用pandasDataFrame情况2:使用普通列表我们给出这两种情况的代码示例。注意:用户的问题中提到了“数据列”,通常我们处理表格数据(如csv)时会用pandas,所以重点放在pandas上。另外,如果用户的数据列中除了下划线之外还有其他的字符需要替换,可以同样用链式调用多次替换,但这里只要求替换下划线。最后,我们生成相关问题。</think> 根据您的需求,我将详细介绍如何在不同编程环境中将数据列中的下划线替换为连字符,并提供相关实现方案。 ### 一、通用解决方案 #### 1. SQL数据库操作 ```sql -- MySQL示例 UPDATE 表名 SET 列名 = REPLACE(列名, '_', '-'); -- PostgreSQL示例 UPDATE 表名 SET 列名 = REPLACE(列名, '_', '-'); ``` #### 2. Excel/Google表格 1. 选择目标数据列 2. 快捷键`Ctrl+H`打开替换对话框 3. 查找内容输入:`_` 4. 替换为输入:`-` 5. 点击“全部替换” ### 二、编程实现方案 #### Python(Pandas库) [^1] ```python import pandas as pd # 读取数据 df = pd.read_csv('data.csv') # 替换操作(处理整列) df['列名'] = df['列名'].str.replace('_', '-', regex=False) # 保存结果 df.to_csv('new_data.csv', index=False) ``` #### Python(原生字符串处理) [^5] ```python # 处理列表数据 data = ["apple_juice", "banana_split", "cherry_pie"] new_data = [item.replace('_', '-') for item in data] ``` #### C++ [^3] ```cpp #include <algorithm> #include <string> void replaceUnderscores(std::string &str) { std::replace(str.begin(), str.end(), '_', '-'); } // 调用示例 std::string data = "data_column"; replaceUnderscores(data); // 结果: "data-column" ``` #### Shell命令(Linux/Mac) [^2] ```bash # 处理CSV文件 sed -i 's/_/-/g' filename.csv # 处理文本列 awk -F, '{gsub(/_/, "-", $1); print}' data.txt ``` ### 三、注意事项 1. **转义处理**:在正则表达式环境中(如Python的regex=True模式),下划线无需转义[^2] 2. **性能优化**:大数据集(>100万行)建议分块处理 3. **特殊场景**: - 仅替换单词间的下划线:使用正则表达式`\b_\b` - 保留特定位置的下划线(如__init__):需添加判断条件 ### 四、原理解析 字符替换本质上是通过字符串扫描实现的: 1. 创建目标字符串副本 2. 逐字符扫描匹配目标字符(_) 3. 替换为指定字符(-) 4. 时间复杂度:$O(n)$(n为字符串长度)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值