awk替换字符串 linux
2016-07-11 09:47:39 junjun5156 阅读数 246

(一)vi编辑器命令

vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用编辑软件进行替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。

: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

(二)perl(不用打开文件,可替换多文件)

例1

执行命令:
perl -p -i -e "s/China/Sumly/g" /www/*.htm /www/*.txt

上面的意思是说将www文件夹下所有的htm和txt文件中的“China”都替换为“Sumly”

 

例2

执行命令:

perl -p -i -e "s/memory_production/memory_production2/g" ./*.sql

 

上面的意思是将当前目录下所有的sql文件中的“memory_production”替换成“memory_production2”

(三)sed 批量替换

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

Svn中文网

  linux sed 批量替换多个文件中的字符串

  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`

  例如:替换/home下所有文件中的www.admin99.net为admin99.net Bbs.Svn8.Com

  sed -i "s/www.admin99.net/admin99.net/g" `grep www.admin99.net -rl /home`

Bbs.Svn8.Com

  exp:sed -i "s/shabi/$/g" `grep shabi -rl ./` Svn8.Com

  2、自己额外附加 Svn8.Com

  2.1 将文件1.txt内的文字“garden”替换成“mirGarden”

  # sed -i "s/garden/mirGarden/g" 1.txt //sed -i 很简单

  2.2 将当前目录下的所有文件内的“garden”替换成“mirGarden” 

## sed -i "s/garden/mirGarden/g" `ls` //其实也就是ls出多个文件名而已

2016-07-27 16:48:00 weixin_33698043 阅读数 72

Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。

命令如下:sed -i “s/原字符串/新字符串/g” `grep 原字符串 -rl 所在目录`

例如:我要把 charset=gb2312 替换为 charset=UTF-8,执行命令:sed -i “s/charset=gb2312/charset=UTF-8/g” ‘grep charset=gb2312 -rl /www’ 即可。

 

如果把文件按竖线"|"或分号";"分割替换成hive的"\01"分割

sed -i 's/|/\x1/g;
s/;/\x1/g
' a.txt

 

把一个[文件目录]\[类别目录]\[日期目录]\*.tar.gz改成gzip格式,并替换分隔符,换成hive的"\01"分割

for dir in `ls .`
 do
   if [ -d $dir ]
   then
     echo $dir
     cd $dir

 for dir in `ls .`
 do
   if [ -d $dir ]
   then
     echo $dir
     cd $dir
     find . -mindepth 1 -name "*.tar.gz" -type f -exec tar -zxvf {} \; -exec rm -rf {} \; 
     find . -mindepth 1 -name "*.*" -type f -exec sed -i 's/|/\x1/g;s/;/\x1/g' {} \; -exec gzip -r {} \; 
     cd ..
   fi
done

     cd ..
   fi
done

 

2018-10-16 09:15:44 gaopeng1111 阅读数 90

LINUX替换字符串的几种方法

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
//替换文件中的所有匹配项

2018-06-29 13:30:35 LuckyQueen0928 阅读数 1426
vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用编辑软件进行替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。

: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/

(二)Sumly法直接替换文件中的字符串。(此法不用打开文件即可替换字符串,而且可以批量替换多个文件。)

参考博文: http://easytech.javaeye.com/blog/316948

例1

执行命令:
perl -p -i -e "s/China/Sumly/g" /www/*.htm /www/*.txt

上面的意思是说将www文件夹下所有的htm和txt文件中的“China”都替换为“Sumly”

 

例2

执行命令:

perl -p -i -e "s/memory_production/memory_production2/g" ./*.sql

 

上面的意思是将当前目录下所有的sql文件中的“memory_production”替换成“memory_production2”

======================================
linux sed 批量替换多个文件中的字符串
http://www.svn8.com/linux/accidence/20100422/29910.html

linux下批量替换文件内容   1、网络上现成的资料 

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

Svn中文网

  linux sed 批量替换多个文件中的字符串

  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`

  例如:替换/home下所有文件中的www.admin99.net为admin99.net Bbs.Svn8.Com

  sed -i "s/www.admin99.net/admin99.net/g" `grep www.admin99.net -rl /home`

Bbs.Svn8.Com

  exp:sed -i "s/shabi/$/g" `grep shabi -rl ./` Svn8.Com

  2、自己额外附加 Svn8.Com

  2.1 将文件1.txt内的文字“garden”替换成“mirGarden”

  # sed -i "s/garden/mirGarden/g" 1.txt //sed -i 很简单

  2.2 将当前目录下的所有文件内的“garden”替换成“mirGarden” 

## sed -i "s/garden/mirGarden/g" `ls` //其实也就是ls出多个文件名而已

====================================
Linux下如何同时替换多个文件中的文本或字符串
http://hi.baidu.com/jiqing0925/blog/item/0e97ea196662ab4242a9ad14.html
====================================
作者:吉庆( qingfang0515@sina.com )
主页:http://hi.baidu.com/jiqing0925
转载请保留作者信息。
-------------------
做一件比较复杂的事通常存在多种方法。
一次性替换多个文件中的文本是我们常遇到的问题,下面是解决这个问题的三种方法:

1. vi 方法
参见vim用户手册26.
*26.3* 改动多个文件

假定你有个变量名为 "x_cnt" 而你要把他改为 "x_counter"。
这个变量在多个 C 文件都被用到了。你需要在所有文件中作此改动。你得这么做。
把所有相关文件放进参数列表:

:args *.c

这个命令会找到所有的 C 文件并编辑其中的第一个。
现在你可以对所有这些文件执行置换命令:

:argdo %s/\<x_cnt\>/x_counter/ge | update

命令 ":argdo" 把另一个命令当作其参数。而后者将对参数列表内所有的文件执行。
作为参数的替换命令 "%s" 作用于所有文本行。它用 "\<x_cnt\>" 来查找"x_cnt"。
"\<" 和 "\>" 用来指定仅匹配那些完整的词,而不是 "px_cnt" 或"x_cnt2"。

替换命令的标记中包含 "g",用以置换同一行文本内出现的所有的匹配词 "x_cnt"。
标记 "e" 用于避免因文件中找不到 "x_cnt" 而出现错误信息。
否则 ":argdo" 命令就会在遇到第一个找不到 "x_cnt" 的文件时中断。
字符 "|" 分隔两条命令。后面的 "update" 命令将那些有改动的文件存盘。
如果没有 "x_cnt" 被改成 "x_counter",这个命令什么也不做。

还有一个 ":windo" 命令,用于在所有视窗内执行其参数所规定的命令。
以及 ":bufdo"命令,对所有缓冲执行其参数所规定的命令。
使用中要小心,因为你在缓冲列表中的文件数量可能超过你能想像的。
请用 ":buffers" 命令 (或 ":ls") 来检查缓冲列表。

2. perl方法
可以在命令行下进行替换,
仍然以vi方法中的例子进行讲解,把c文件中的"x_cnt" 改为 "x_counter"。
可以执行以下命令:
find . -name '*.c' -print0 | xargs -0 perl -pi -e 's/x_cnt/x_counter/g'

xargs 把find命令的结果作为perl的参数。
find的参数-print0和xargs的参数-0是防止文件名中有空格或新行造成错误,可以man xargs获得帮助。

注意: 如果替换的字符包括 ()[]/"'!? 等等这样的特殊字符,你必须在字符前加上反斜杠\ 。

这种方法的好处是不用启动编辑器,比较迅速。缺点是容易出现不想要的替换,例如:把px_cnt替换成了px_counter。

3. sed
仍以上面的例子讲解:
find . -name "*.c" -print0 | xargs -0 sed -i 's/x_cnt/x_counter/g'
优缺点和perl方法相同。

以上方法的差异只在于使用工具的不同,相信肯定还有别的工具能办到这件事。
比如emacs,肯定也能做到这些,只是因为我不用emacs,所以不熟悉。
希望大家总结自己得心应手的方法。

==================
Linux sed批量替换多个字符串

http://www.itqun.net/content-detail/105074.html

比如,要将目录/modules下面所有文件中的zhangsan都修改成lisi,这样做:

sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl /modules`

解释一下:

-i 表示inplace edit,就地修改文件
-r 表示搜索子目录
-l 表示输出匹配的文件名

这个命令组合很强大,要注意备份文件。


(1)sed 'y/1234567890/abCDEFGHIJ/' test_sed

sed 'y/1234567890/abCDEFGHIJ/' filename
abCDEFGHIJ
BCDEFGHIJA
CDEFGHIJAB
DEFGHIJABC
注意变换关系是按两个list的位置对应变换

其中:test_sed的内容是:

1234567890
2345678901
3456789012
4567890123


(2)替换每行所有匹配

sed 's/01/Ab/g' test_sed
1234567890
23456789Ab
3456789Ab2
456789Ab23
注意:第一行的0,1没有分别替换为A,b




删除:d命令

        *

          $ sed '2d' example-----删除example文件的第二行。
        *

          $ sed '2,$d' example-----删除example文件的第二行到末尾所有行。
        *

          $ sed '$d' example-----删除example文件的最后一行。
        *

          $ sed '/test/'d example-----删除example文件所有包含test的行。

替换:s命令

        *

          $ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
        *

          $ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
        *

          $ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
        *

          $ sed -n 's/\(love\)able/\1rs/p'



:%s#/usr/bin#/bin#g

可以把文件中所有路径/usr/bin换成/bin




2019-06-07 09:08:02 londa 阅读数 8

1. 基本的替换 

:s/vivian/sky/ 替换当前行第一个 vivian 为 sky 

:s/vivian/sky/g 替换当前行所有 vivian 为 sky 

:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky 

:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky 

(n 为数字,若 n 为 .,表示从当前行开始到最后一行) 

:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky 

:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky 

2. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符 

:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/ 

:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/ 

3. 删除文本中的^M 

问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M,请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。 

使用命令:cat filename1 | tr -d “^V^M” > newfile; 

使用命令:sed -e “s/^V^M//” filename > outputfilename 

需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。 

在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令: 

:%s/^V^M// 
:%s/^M$//g 

如果上述方法无用,则正确的解决办法是: 

tr -d “\r” < src >dest 

tr -d “\015″ dest 

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 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。

Linux vi替换字符串

阅读数 23

Linuxvi替换字符串 1.基本的替换 :s/vivian/sky/替换...

博文 来自: cpongo3

Linux vi替换字符串

阅读数 18

1.基本的替换:s/vivian/sky/替换当前行第一个vivian为sky:s/vivian/sky/g替换当前行所有vivian为sky:n,$s/vivian/sky/替换第n行开始到最后一行中每一行的第一个vivian为sky:n,$s/vivian/sky/g替换第n行开始到最后一行中每一行所有vivian...

博文 来自: iteye_2234

Linux vi替换字符串

阅读数 22

Linuxvi替换字符串1.基本的替换 :s/vivian/sky/替换当前行第一个vivian为sky :s/vivian/sky/g替换当前行所有vivian为sky :n,$s/vivian/sky/替换第n行开始到最后一行中每一行的第一个vivian为sky :n,$s/vivian/sky/g替换第n行开始到最后一行中每一行所有vivi...

博文 来自: u010735147

Linux vi替换字符串

阅读数 16

1.基本的替换 :s/vivian/sky/替换当前行第一个vivian为sky :s/vivian/sky/g替换当前行所有vivian为sky :n,$s/vivian/sky/替换第n行开始到最后一行中每一行的第一个vivian为sky :n,$s/vivian/sky/g替换第n行开始到最后一行中每一行所有vivian为sky (n为数字,若n...

博文 来自: qq_19396231

Linux vi替换字符串

阅读数 284

 Linuxvi替换字符串  1.基本的替换:s/vivian/sky/替换当前行第一个vivian为sky:s/vivian/sky/g替换当前行所有vivian为sky:n,$s/vivian/sky/替换第n行开始到最后一行中每一行的第一个vi

博文 来自: lalapapa2011
没有更多推荐了,返回首页