总结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替换字符串的几种方法的主要内容,如果未能解决你的问题,请参考以下文章