08 引用

引用必须是可以被赋值的东西,不可以是常量

char c;
char *p = &c;
char &r = c; // 引用

一般的引用都需在定义的时候给他一个初始值,初始值必须是一个变量,或是一个可赋值的东西

r是c的一个别名。

int x = 47;
int &y = x;// 引用
// x and y now refer to the same variable
cout << "y = " << y; // 47
y = 18; // 是对引用的变量的赋值
cout << "x = " << x; // 18

加上const的引用

const int& z= x;
// z是x的别名,但是不能通过z修改x的值,z不能被赋值
z = 18; // error!
// x的值仍然可以变,x的值变了,z的值也对应发生变化(z是x的别名)

函数调用

void f(int& x);

f(y) // initialized when function is called

此时x就是y的reference,如果在f里面对 x变化 那么外面的y也就变化了

引用的绑定不能变化

the target of a reference must have a location

void func(int &);
func(i * 3); // warning or error!

因为i 3 没有地方:只有结果,没有一个有名字的变量存储这个结果*

ps: 引用就是指针,不同的是 引用的地址不能变化。而指针指向的地址可以变化

int* f(int* x){
    (*x)++;
    return x; // safe, x is outside this scope
}
int& g(int& x){
    x++;	// same effect as in f()
    return x;// safe, x is outside this scope
}

易错点

int x;
int& h(){
	int q;
	return q; // error! 因为q是一个本地变量
    return x; // safe, x is outside this scope
}
int main(){
    int a = 0;
    f(&a); // ugly (but explicit)
    g(a);  // clean (but hidden)
   // !!!!
    h() = 16 ; // 这是可以的!!! 此时是 全局变量x被赋值为16
}

在c++中 看到g(a), 无法保证 a的值是不会修改的 有可能不是c里面的形参,而是实参

无法构成overload

int& g(int& x){}

int g(int x){}
// 无法构成重载,在调用g函数的时候无法区分

指针和引用

image-20211220233913904

实际上,引用的实现就是在指针上实现的。就是 const point

image-20211220235112073

<think>好的,用户想了解如何在sed中使用捕获分组和反向引用进行文本处理。首先,我需要回忆一下sed的基本用法和正则表达式的相关知识。记得sed中的分组是通过圆括号()来实现的,而反向引用则用\1、\2这样的形式。但要注意,默认情况下sed使用的是基础正则表达式(BRE),可能需要加上-r选项或转义括号。 然后,我应该检查用户提供的引用内容。引用[1]、[2]、[3]都提到了捕获组和反向引用的用法,特别是需要用到-r参数来启用扩展正则表达式,这样括号就不用转义了。比如在替换命令s/pattern/replacement/中,用括号包裹要捕获的部分,替换时用\1、\2来引用。 接下来,需要给出具体的示例。例如,调换两个单词的顺序,可以用s/\(.*\) \(.*\)/\2 \1/,或者在扩展模式下用s/(.*) (.*)/\2 \1/并加上-r选项。另外,处理日期格式或重复字符的情况也是常见的应用场景,比如将YYYY-MM-DD转换成DD/MM/YYYY,或者删除重复的单词。 还要注意用户可能遇到的问题,比如分组编号的顺序,以及何时需要使用转义符。同时,提醒用户在使用分组时可能遇到的常见错误,比如忘记-r导致括号需要转义,或者反向引用的编号错误。 最后,根据用户的要求生成相关问题,可能涉及其他sed高级功能、多分组处理、与AWK的比较,以及常见错误排查。确保问题覆盖用户可能进一步探索的方向,帮助他们深入理解。</think>### sed 分组替换与反向引用语法详解 在 `sed` 中使用捕获分组和反向引用的核心语法为: $$s/\(pattern1\)\(pattern2\)/\2\1/g$$ 其中 `\(...\)` 定义捕获分组,`\1` 和 `\2` 表示反向引用分组内容[^1][^2][^3]。 #### 一、基础语法规则 1. **捕获分组** - 基础正则表达式(BRE)需转义括号:`\(pattern\)` - 扩展正则表达式(ERE)使用 `-r` 参数可省略转义:`sed -r 's/(pattern)/replacement/'` 2. **反向引用** - 使用 `\1` 至 `\9` 依次引用分组内容 - 替换字符串中按捕获顺序编号,例如第一个分组为 `\1`,第二个为 `\2` #### 二、应用示例 1. **交换字段位置** ```bash # 将 "John:Doe" 转换为 "Doe,John" echo "John:Doe" | sed -r 's/([^:]+):([^:]+)/\2,\1/' ``` 2. **日期格式转换** ```bash # 将 "2023-08-21" 转换为 "21/08/2023" echo "2023-08-21" | sed -r 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' ``` 3. **重复内容检测** ```bash # 删除连续重复的单词:"hello hello world" → "hello world" echo "hello hello world" | sed -r 's/\b(\w+)\b \1/\1/g' ``` #### 三、进阶技巧 1. **嵌套分组处理** ```bash # 匹配带括号的内容:"(重要)" → "[重要]" echo "(重要)" | sed -r 's/\(([^)]+)\)/[\1]/' ``` 2. **结合多命令操作** ```bash # 同时处理多个字段:"user=admin;role=root" → "ADMIN (ROOT)" sed -r 's/(\w+)=(\w+);(\w+)=(\w+)/\U\2 (\U\4)/' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值