总结linux替换字符串的几种方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结linux替换字符串的几种方法相关的知识,希望对你有一定的参考价值。

一)通过vi编辑器来替换。
vi/vim 中可以使用 :s 命令来替换字符串。
:s/well/good/ 替换当前行第一个 well 为 good
:s/well/good/g 替换当前行所有 well 为 good
:n,$s/well/good/ 替换第 n 行开始到最后一行中每一行的第一个 well 为 good
:n,$s/well/good/g 替换第 n 行开始到最后一行中每一行所有 well 为 good
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/well/good/(等同于 :g/well/s//good/) 替换每一行的第一个 well 为 good
:%s/well/good/g(等同于 :g/well/s//good/g) 替换每一行中所有 well 为 good
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#well/#good/# 替换当前行第一个 well/ 为 good/
:%s#/usr/bin#/bin#g 可以把文件中所有路径/usr/bin换成/bin

 

(二)直接替换文件中的字符串。(此法不用打开文件即可替换字符串,而且可以批量替换多个文件。)
1.perl命令替换,参数含义如下:
-a    自动分隔模式,用空格分隔$_并保存到@F中。相当于@F = split ”。分隔符可以使用-F参数指定
-F    指定-a的分隔符,可以使用正则表达式
-e    执行指定的脚本。
-i<扩展名>   原地替换文件,并将旧文件用指定的扩展名备份。不指定扩展名则不备份。
-l    对输入内容自动chomp,对输出内容自动添加换行
-n    自动循环,相当于 while(<>) 脚本;
-p    自动循环+自动输出,相当于 while(<>) 脚本; print;
用法示例:
perl -p -i.bak -e 's/\\bfoo\\b/bar/g' *.c
将所有C程序中的foo替换成bar,旧文件备份成.bak

perl -p -i -e "s/shan/hua/g" ./lishan.txt ./lishan.txt.bak
将当前文件夹下lishan.txt和lishan.txt.bak中的“shan”都替换为“hua”

perl -i.bak -pe 's/(\\d+)/ 1 + $1 /ge' file1 file2
将每个文件中出现的数值都加一

 

 

2.sed命令下批量替换文件内容   

格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径` 文件名

-i 表示inplace edit,就地修改文件

 -r 表示搜索子目录

 -l 表示输出匹配的文件名
s表示替换,d表示删除

示例:sed -i "s/shan/hua/g"  lishan.txt

          把当前目录下lishan.txt里的shan都替换为hua       各个Linux详细命令介绍及应用可如下进行查找

参考技术A (1)VIM替换字符串方法
1. 基本替换
:s/str1/str2/ 替换当前行第一个str1为str2
:s/str1/str2/g 替换当前行所有str1为str2
:n,$s/str1/str2/ 替换第 n 行开始到最后一行中每一行的第一个str1为str2
:n,$s/str1/str2/g 替换第 n 行开始到最后一行中每一行所有str1为str2
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
:%s/str1/str2/(等同于 :g/str1/s//str2/) 替换每一行的第一个str1为str2
:%s/str1/str2/g(等同于 :g/str1/s//str2/g) 替换每一行中所有str1为str2
2. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#str1/#str2/# 替换当前行第一个str1/ 为str2/
:%s+/str11/str12/+/str21/str22+ (使用+ 来 替换 / ): /str11/str12/替换成/str21/str22/
3. 文件中删除^M
问题描述:对于换行,Windows下用回车换行(0A0D)来表示,Linux下是回车(0A)来表示。这样,将window上的文件拷到Unix上用时,总会有个^M,请写个用在Unix下的过滤Windows文件的换行符(0D)的shell或c程序。有两种方法可以完成此目的:
(1)使用命令:cat oldfilename | tr -d “^V^M” > newfilename
(2)使用命令:sed -e “s/^V^M//” oldfilename > newfilename
需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。
在vim中处理:首先使用vim打开文件,然后按ESC键,接着输入命令:
:%s/^V^M//
:%s/^M$//g
如果上述方法无用,则正确的解决办法是:
(1) tr -d "\r" < old_file_name > new_file_name 或者 cat oldfilename | tr -d "\r" > new_file_name
(2) tr -d "\015" < old_file_name > new_file_name或者 cat oldfilename | tr -d "\015" > new_file_name
strings A>B
4. 其它技巧
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g 功能同上
从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
(2)sed命令替换字符串
sed替换的基本语法为:
代码如下:

sed
's/原字符串/替换字符串/'
单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义,但是单引号”‘”是没有办法用反斜线”\”转义的,这时候只要把命令中的单引号改为双引号就行了,例如:

代码如下:

sed "s/原字符串包含'/替换字符串包含'/"
//要处理的字符包含单引号
命令中的三根斜线分隔符可以换成别的符号,这在要替换的内容有较多斜线是较为方便,只需要紧跟s定义即可,例如换成问号”?”:

代码如下:

sed 's?原字符串?替换字符串?'
//自定义分隔符为问号
可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个,例如:
代码如下:

sed 's/原字符串/替换字符串/'
//替换所有匹配关键字
上箭头”^”表示行首,美元”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行),这里犯二了,搜了半天哪个符号表示首行,半天才想起来,首行就是数字”1″啊.那么在行首和行尾添加字符串就是把行尾和行首替换,例如:

代码如下:

sed 's/^/添加的头部&/g' //在所有行首添加
sed
's/$/&添加的尾部/g' //在所有行末添加
sed '2s/原字符串/替换字符串/g' //替换第2行
sed
'$s/原字符串/替换字符串/g' //替换最后一行
sed '2,5s/原字符串/替换字符串/g' //替换2到5行
sed
'2,$s/原字符串/替换字符串/g' //替换2到最后一行
替换样式可以多个在同一条命令中执行,用分号”;”分隔,例如:

代码如下:

sed 's/^/添加的头部&/g;s/$/&添加的尾部/g'
//同时执行两个替换规则
sed处理过的输出是直接输出到屏幕上的,要保存可以将输出重定向,或者使用参数”i”直接在文件中替换:

代码如下:

sed -i 's/原字符串/替换字符串/g' filename
//替换文件中的所有匹配项
参考技术B 实现目录文件递归替换: 1、find目录下的所有文件内容脚本 #!/bin/bash str=xx #原文字符串 cstr=yy#替换成的字符串 dir=/home/test#指定目录 for i in `find $dir -type f ` do if grep $str $i #测试原文字符串本回答被提问者采纳

面试题总结2反转字符串的几种形式

反转字符串:

作为面试题出现频率最高的手写代码题,有必要做一下总结。

【形式1】:

题目:

/*
反转字符串-1:
orgin = "where‘d you go?"
dest = "?og uoy d‘erehw"
*/

分析:很容易的题目。解决方法有2种:可以递归输出、也可以“头尾”指针向中间移动,边移动变交换。

代码实现:(vs2017下测试通过)

 1 #include<iostream>
 2 using namespace std;
 3 
 4 void reserve01(char *origin)
 5 
 6     if (*origin == \\0)
 7     
 8         return;    
 9     
10     else 
11     
12         reserve01(origin + 1);
13         cout << *origin ;
14     
15 
16 
17 void reserve02(char origin[], int length)
18 
19     char *head = origin;
20     char *tail = origin + length - 1;
21     while (head != tail)
22     
23         char temp = *head;
24         *head = *tail;
25         *tail = temp;
26         head ++;
27         tail--;
28     
29 
30 
31 int main()
32 
33     char origin[] = "where‘d you go?";
34 
35     // 方法1:采用递归的方式直接输出
36     reserve01(origin);
37     cout << endl;
38 
39     // 方法2:在origin上直接逆置
40     reserve02(origin, 15);
41 
42     // 输出方法2的返回值
43     cout << origin << endl;
44 
45     system("pause");
46     return 0;
47 

 

 

【形式2】:

题目:

/*
反转字符串-2:
orgin = "where‘d you go?"
dest = "d‘erehw uoy ?og"
*/

分析过程:如图所示,

技术图片

代码实现:(vs2017下测试通过)

 1 #include<iostream>
 2 using namespace std;
 3 
 4 void reserverOneWord(char *r, char *p)
 5 
 6     while (r < p)
 7     
 8         char temp = *r;
 9         *r = *p;
10         *p = temp;
11         r++;
12         --p;
13     
14 
15 
16 void reserverString(char *str)
17 
18     char *p, *q, *r;
19 
20     p = str;
21     while (*p ==  )                        // 让 p r指向第一个非空格的字符,为了处理“  hello world”这种情况
22         ++p;
23     if (*p == \\0)                            // 为了处理"             "这种情况
24         return;
25     
26     r = p;
27     q = p + 1;
28 
29     while (*q != \\0)
30     
31         if ((*p >= a && *p <= z) && (*q ==  ))
32         
33             reserverOneWord(r, p);        // 反转 r到p这部分
34             
35             while (*q ==  )
36                 ++q;
37             if (*q == \\0)                        // 为了处理"  hello world                   "这种情况
38                 return;
39             r = q;
40             p = q;
41             q++;
42         
43         else
44         
45             ++q;
46             ++p;
47         
48     
49     reserverOneWord(r, p);            // 此时q指向 \\0,需要反转r到p位置的字符串
50 
51 
52 int main()
53 
54     // 测试用例
55     // char str[] = "where‘d go?";
56     //char str[] = "hello world!";
57     //char str[] = "  hello world                       ";
58     char str[] = "      ";
59 
60     reserverString(str);
61     cout << str;
62 
63     system("pause");
64     return 0;
65 

【形式3】:

题目:

(未完待续...)

 

 

 

以上是关于总结linux替换字符串的几种方法的主要内容,如果未能解决你的问题,请参考以下文章

linux替换字符串的几种方法

JS刷新当前页面的几种方法总结

JS去除字符串前后空格的几种方法

Linux 替换^M字符 方法

linux几种常见的文件内容查找和替换命令

MySQL字符串处理函数的几种常见用法