≡菜单

Unix Sed教程:使用RegEx查找和替换文件内的文本

Sed范例 for Unix  和  的Linux - Find  和  Replace本文是正在进行的Unix Sed教程系列的一部分。在之前的文章中,我们讨论了 sedprint operationseddelete operation.

In this article let us review how to use sedsubstitute command “s”.

的`s’命令可能是`sed中最重要的’并且有很多不同的选择。

的`s’命令尝试将样式空间与提供的REGEXP匹配;如果匹配成功,则将匹配的模式空间部分替换为REPLACEMENT。

Syntax:

#sed 'ADDRESSs/REGEXP/REPLACEMENT/FLAGS' filename
#sed 'PATTERNs/REGEXP/REPLACEMENT/FLAGS' filename
  • s是替代命令
  • /是定界符
  • REGEXP是匹配的正则表达式
  • 替换是要替换的价值

标志可以是以下任意一种

  • g将所有REGEXP实例替换为REPLACEMENT
  • n可以是任何数字,用REPLACEMENT代替REGEXP的第n个实例。
  • p If substitution was made, then prints the new pattern 空间.
  • 我以不区分大小写的方式匹配REGEXP。
  • w文件如果进行替换,则将结果写到给定文件中。
  • 我们可以使用不同的定界符(@%;:之一)代替/

让我们首先创建thegeekstuff.txt文件,该文件将在下面提到的所有示例中使用。

$ cat thegeekstuff.txt
# Instruction Guides
1. 的Linux Sysadmin, 的Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in 的Linux
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.

现在让我们回顾一些有趣的替换示例。

1.代词“Linux” to “Linux-Unix” Using seds//

在下面的示例中,在输出行中“1. 的Linux-Unix Sysadmin, 的Linux Scripting etc” 上 ly first 的Linux is replaced 通过 的Linux-Unix. If no flags are specified the first match of line is replaced.

$ sed's/Linux/Linux-Unix/' thegeekstuff.txt
# Instruction Guides
1. 的Linux-Unix Sysadmin, 的Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in 的Linux-Unix
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.

2. Substitute all Appearances of a Word Using seds//g

的below sedcommand replaces all occurrences of 的Linux to 的Linux-Unix using global substitution flag “g”.

$ sed's/Linux/Linux-Unix/g' thegeekstuff.txt
# Instruction Guides
1. 的Linux-Unix Sysadmin, 的Linux-Unix Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in 的Linux-Unix
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.

3. Substitute Only 2nd Occurrence of a Word Using seds//2

在下面的示例中,在输出行中“1. 的Linux Sysadmin, 的Linux-Unix Scripting etc.” 上 ly 2nd occurance of 的Linux is replaced 通过 的Linux-Unix.

$ sed's/Linux/Linux-Unix/2' thegeekstuff.txt
# Instruction Guides
1. 的Linux Sysadmin, 的Linux-Unix Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in 的Linux
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows- Sysadmin, reboot etc.

4. Write Changes to a File 和 Print the Changes Using seds//gpw

的example below has substitution with three flags. It substitutes all the occurance of 的Linux to 的Linux-Unix 和 prints the substituted output as well as written the same to the given the file.

$ sed-n 's/Linux/Linux-Unix/gpw output' thegeekstuff.txt
1. 的Linux-Unix Sysadmin, 的Linux-Unix Scripting etc.
4. Storage in 的Linux-Unix
$ cat output
1. 的Linux-Unix Sysadmin, 的Linux-Unix Scripting etc.
4. Storage in 的Linux-Unix

5.仅当使用sed将线与图案匹配时才替换

在此示例中,如果行与模式匹配“-“,然后替换的所有字符“-” with the empty.

$ sed'/\-/s/\-.*//g' thegeekstuff.txt
# Instruction Guides
1. 的Linux Sysadmin, 的Linux Scripting etc.
2. Databases
3. Security (Firewall, Network, Online Security etc)
4. Storage in 的Linux
5. Productivity (Too many technologies to explore, not much time available)
#  Additional FAQS
6. Windows

6.使用sed从每行中删除最后X个字符

这个sedexample deletes last 3 characters from each line.

$ sed's/...$//' thegeekstuff.txt
# Instruction Gui
1. 的Linux Sysadmin, 的Linux Scripting e
2. Databases - Oracle, mySQL e
3. Security (Firewall, Network, Online Security e
4. Storage in Li
5. Productivity (Too many technologies to explore, not much time availab
#  Additional F
6. Windows- Sysadmin, reboot e

7.使用sed消除评论

Delete all the comment lines from a file as shown below using sedcommand.

$  sed-e 's/#.*//' thegeekstuff.txt

1. 的Linux Sysadmin, 的Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in 的Linux
5. Productivity (Too many technologies to explore, not much time available)

6. Windows- Sysadmin, reboot etc.

8.使用sed消除注释和空白行

在此示例中,有两个命令由‘;’

  • 第一个命令将以#开头的行替换为空白行
  • 第二条命令删除空行。
$ sed-e 's/#.*//;/^$/d'  thegeekstuff.txt
1. 的Linux Sysadmin, 的Linux Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Security (Firewall, Network, Online Security etc)
4. Storage in 的Linux
5. Productivity (Too many technologies to explore, not much time available)
6. Windows- Sysadmin, reboot etc.

9.使用sed将DOS换行符(CR / LF)转换为Unix格式

将DOS文件复制到Unix,您可以在每行末尾找到\ r \ n。

这个example converts the DOS file format to Unix file format using sedcommand.

$ sed's/.$//' filename

10.使用sed消除文件中的HTML标记

In this example, the regular expression given in the sedcommand matches the html tags 和 replaces with the empty.

$ sed-e 's/<[^>]*>//g'
This <b> is </b> an <i>example</i>.
This  is  an example.

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50 的Linux Sysadmin Tutorials
  2. 50 Most Frequently Used 的Linux Commands (With Examples)
  3. Top 25 Best 的Linux Performance Monitoring 和 Debugging Tools
  4. Mommy, I found it! – 15 Practical 的Linux Find Command Examples
  5. 的Linux 101 Hacks第二版电子书 的Linux 101 Hacks Book

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书 Vim 101黑客手册

{ 55 评论 … 加一 }

  • 马库斯·罗兹(Marcus Rhodes) 2009年9月30日,上午7:47

    一个人将如何重新排列ls -al输出的列?

    在缺少gnu / 的Linux的AIX上’的出色功能,我需要ls -al才能输出 …

    的filename -rwxrwxrwx 1 root root 12345678 …

    … instead of …

    -rwxrwxrwx 1 root root 12345678 Jan 01 2009 的filename

    谢谢!

  • 保罗·M 2009年9月30日,上午11:15

    拉梅什

    这些文章使我受益匪浅。谢谢!你有做运气吗“Printer Friendly”这些页面的版本?我希望能够打印出来并在上面写下我自己的笔记。

    保罗

  • 吉米 2009年9月30日,下午1:25

    你好

    在示例10中似乎有一些错别字。我正在获得此输出行,这显然不是您想要的:

    这个<b is </b an <iexample</i

    我本人无法提出正确的版本。你能帮我吗?

  • 安克塞普 2009年10月1日,上午1:38

    例如10我认为正确的语法是
    sed-e ‘s/]*>//g’

  • 安克塞普 2009年10月1日,上午1:39

    抱歉,您是对的Jimi。

  • 纳斯林 2009年10月1日,上午8:58

    @ 萨西卡拉

    $ sed-e ’s/]*>//g’
    bash:[^:没有这样的文件或目录

    这也不起作用-

  • 拉梅什·纳塔拉詹(Ramesh Natarajan) 2009年10月2日,上午10:19

    @保罗,

    实现了“友好打印”选项。您’在所有文章的底部都会看到这一点。谢谢。

  • 马库斯·罗兹(Marcus Rhodes) 2009年10月2日,下午1:31

    嗯…可在Ubuntu上使用,尽管文件名需要填充,但对AIX无效。

  • 吉米 2009年10月8日,下午1:48

    我对示例10进行了一次谷歌搜索,发现了这个解决方案,它似乎可行:

    sed-n ‘/^$/!{s/]*>//g;p;}’

    It’s from this site:

    http://www.unix.com/linux/45584-how-remove-only-html-tags-inside-file.html

  • 斯里尼瓦斯 2010年12月27日,下午1:35

    优秀的!在所有文章之后,所有文章都被很好地介绍。

  • 皮尤什 2011年1月18日,上午3:01

    你好

    我可以一次使用sed使用两个或多个查找和替换。

  • 里士 2011年1月25日,上午1:45

    你好
    我正在尝试编写脚本。
    在/ var / log / messages中,与当前日期相比,我必须删除5天之前的行。大家能帮我这个脚本吗?
    谢谢

  • 2011年6月26日,下午7:31

    你好

    After i type in the command, eg sed‘s/Linux/Linux-Unix/’ thegeekstuff.txt ,

    我输入vi thegeekstuff.txt,看来旧文件仍然存在。因此,我是否仍需要输入任何内容以将更改保存在thegeekstuff.txt中?

    提前致谢。

  • 布拉德 2011年10月29日,上午3:15

    @梅

    您需要将输出定向到另一个文件。否则将其写入标准输出,即终端屏幕。因此:

    sed‘s/Linux/Linux-Unix/’ thegeekstuff.txt > new_file.txt

    也要感谢博客作者提供的该网站及其丰富的内容。

  • 伊凡·内娃(Ivan Neva) 2012年2月8日,上午9:28

    你好

    这是一个非常有用的教程。一世’我实际上面临着模式搜索和避风港的问题’没办法弄清楚。我有一个文件需要加载到数据库,为此,当我找到以下字符序列时,需要插入一个特殊字符:双引号– end of line – double quotes (“\n”)。我需要在第一个双引号和行尾之间插入一个@符号(“@\n”)。 \ n当然是行尾字符。到目前为止,我’m只能使用以下命令插入字符:(“$), sed‘s/\”$/&@/g’文件名,但有时我需要确保下一行以双引号(“)。使用SED模式匹配有什么方法吗?我尝试了不同的组合,但没有任何运气。

    在此先感谢您,很棒的博客。

    伊凡·内娃(Ivan Neva)
    甲骨文数据库管理员

  • 约书亚·赫斯特(Joshua Hurst) 2012年2月11日,下午12:34

    伊万
    sedworks line 通过 line. There is no sedoption that I know of to do what you are looking for.

  • 钦纳 2012年2月20日,下午3:11

    钦纳 ,

    我有类似的文件
    拉贾
    拉维
    基兰

    i want to add 空间 at the beginning of every line.help me

  • 钦纳 2012年2月22日,上午8:41

    钦纳 ,

    例子10
    我有这样的文件

    尝试使用sed
    $ sed-e ‘s/\([]\)//g’
    输出是
    linux
    红色的帽子
    ubuntu
    谢谢

  • 钦纳 2012年2月22日,上午8:45

    钦纳 ,

    例子10
    我有这样的文件

    尝试使用sed
    $ sed-e ‘s/\([]\)//g’
    输出是
    linux
    红色的帽子
    ubuntu
    ******************************************** 谢谢

  • 标记 2012年3月22日,上午6:38

    你好。我看到了我可以替换一个单词’在每行中的第一次出现。但是我的问题是:仅当单词是一行中的第一个单词时,才可以替换它吗?
    例如:我要替换‘pine’ with ‘apple’,并且我有以下文字:

    松树 cat 松树 car tag can
    cat 松树 tag car

    在这里,这个词‘pine’ from the second line should remain unchanged, as well as the second occurence in the first line. 的result would be:

    苹果 cat 松树 car tag can
    cat 松树 tag car

  • 匿名 2012年3月28日,上午7:21

    在行首使用$符号进行标记,因此

    sed‘s/$pine/apple/’ should do it

  • 匿名 2012年3月28日,下午2:16

    匿名,美元符号表示行的结尾,而carret表示行的开始。

  • 普里亚 2012年4月13日,晚上11:01

    sed‘s/^pine/apple/’ filename

  • 森提尔 2012年4月24日,上午9:46

    你好
    我有一个带有某些属性的xml文件,我想根据其他标记的值替换一个值。我尝试了Perl及其工作方式。但是我想用‘sed’. please help.
    示例xml文件:

    名字A
    值A

    名称B
    值B

    名称C
    值C

    在上面的示例中,我想将valueB的值更改为基于nameB的用户输入数据。提示是“nameB”是默认设置,不会更改。但是,即使在用户输入之前,值B也可以不同。因此,sed命令应找到“nameB”属性,然后为其修改标签。

  • 马赫什 2012年5月30日,上午12:24

    我有这样的文件,并且有很多相同的参数出现。

    8109#气
    {
    DELAY_TIME 1;
    }
    现在我想将其更改为1到15,但是我找不到DELAY_TIME并替换,因为DELAY_TIME发生了很多次。有没有办法我可以做到这一点?

  • 帕塔萨拉希达什 2012年6月14日,上午3:05

    试试这个命令。这很简单
    :%s / search_string / replacement_string / g

  • 埃里克·H。 2012年6月26日,下午3:45

    你好

    我有这个txt文件,其中包含;

    1418W CROMAX ADJUSTER ;; 588,01
    1420W CROLIDT TONEFARVE ;; 841年
    1421W CIPAX WONEEVER TONESYSTEM ;; 462,57

    我需要剥离一下。
    我如何删除第一个(包括)之间的任何内容“space”直到第一个“;”

    所以我’m留下一个类似的文件;

    1418W ;; 588,01
    1420W ;; 841
    1421W ;; 462,57

  • Prem 2012年7月10日,上午7:25

    你好

    任何人都可以让我知道您对此情况的想法:
    例如:<![CDUMP欢迎来到Unix世界$ sorry#
    12行
    !我们所拥有的都是正确的

    要求:我想删除介于和之间的换行符

    提前致谢,
    Prem 。

  • Prem 2012年7月10日,上午7:26

    对不起,我错过了在行尾指定的内容。

    例如:<![CDUMP欢迎来到Unix世界$ sorry#
    12行
    !我们所拥有的都是正确的

  • 蒙蒂·盖瑟 2012年8月3日,上午10:18

    我需要将目录中每个.sh模块中的BART更改为CART。以下工作有效吗?

    $ sed-g -p ‘s/BART/CART/g’ *.*

  • 周杰伦 2012年9月3日,上午2:10

    在第一个示例中,应该在第四行“4. Storage in 的Linux” 和 not “4. Storage in 的Linux-Unix” ?

  • 费尔南多 2012年11月8日,下午5:25

    你好

    你能帮我吗,我有下一个问题。我收到一个包含很多行的平面文件,每行都有用管道分隔的数据,例如:
    WD3783C6EA3978A777 || 2012/10/26 16:24:44 || I ||导体
    WDE56DAF1870A5CC57 || 2012/10/26 16:20:01 || I || ROSA
    WCFBF376C70921F97B || 2012/10/26 16:12:19 || I || ERIKA
    WC024ABB31EACB6F1D || 2012/10/26 15:58:08 || I ||耶稣基督

    的problem is that some rows have two or more CR in the middle of the data, for example:
    WD3783C6EA3978A777 || 2012/10/26 16:24:44 || I ||导体
    WDE56DAF1870A5CC57 || 2012/10/26 16:20:01 |

    | I || ROSA
    WCFBF376C70921F97B |
    | 26/10/2012 16:12:19 || I || ERIKA
    WC024ABB31EACB6F1D || 2012/10/26 15:58:08 || I ||耶稣基督

    我需要用空格替换出现在数据中间的CR‘ ‘,但是每行的最后一个CR。该命令回显`sed -e‘s/$/\ |\ /g’file.txt`将所有CR替换为一个空格,但是我不知道我还必须汇总什么才能尊重每行的最后一个CR。
    谢谢。

  • 寿司 2012年11月20日,下午4:20

    你好

    在第一个示例中,第4行中的ur输出是linux-unix。
    是打印错误还是我’m wrong

  • dude4linux 2013年2月23日,下午12:29

    找到了我自己问题的答案。这是一个bash shell逃逸,与sed无关。 sed表达式必须使用单引号以保留缩进和换行符。在bash中,在单引号内转义单引号的正确方法是‘\”。我与”’但没有雪茄。运行的sed命令是:
    sed-i -e ‘/ls –color=auto/a \
    别名ll =’\”ls –color=auto -lh’\” \
    别名la =’\”ls –color=auto -lAh’\” \
    别名l =’\”ls –color=auto -CF’\”
    ‘ ~/.bashrc

  • 自由人 2013年2月26日,上午1:58

    wan在前面加上单词怎么样?

  • 费利佩 2013年3月12日,晚上9:31

    嗨,如何使这个命令起作用(语法应该是错误的):

    sed‘s/if t > time.time() – 60:/if t > time.time() – 4:/’/share/HDA_DATA/.qpkg/CouchPotato2/couchpotato/core/plugins/scanner/main.py

    我要变化“sed ‘s/if t > time.time() – 60:” to “sed ‘s/if t > time.time() – 4:”

  • 尼拉·库玛(Niraj Kumar) 2013年4月12日,上午7:23

    你好

    请帮助:

    我在文件中有这样的数据:
    123,ABC,84,TYPE hkahsd DIG 147,789,TYPE hkahsd DIG 147
    546,AJH,78,DIG 142阿斯达德,890,DIG 142阿斯达德

    输出应如下所示:
    123,ABC,84,DIG 147,789,TYPE hkahsd DIG 147
    546,AJH,78,DIG 142,890,DIG 142 asdsdad

  • 生锈的 2013年6月25日,上午5:25

    模式和地址在第一个示例中代表什么?

  • 苏亨杜·贝拉 2013年8月14日,上午12:02

    它非常有用。谢谢

  • 雪莉 2013年8月17日,上午8:47

    非常有用的教程。我喜欢它。
    在示例1中看起来像是一个错字。不仅它替换了第1行的第一个匹配项,而且还替换了第4行的第一个匹配项。

    舍里

  • 马利克 2013年10月29日,上午1:55

    的last point u have mentioned is quite interesting. If suppose i want to remove “”像这样的介词的标记,以便使用sed做到这一点。

  • 纳文 2014年2月2日,上午10:12

    怎么写^ $

  • 废话 2014年3月18日,上午4:44

    使用sed进行替换后,如何将更改内联保存到文件中

  • 埃里克 2014年6月23日,下午2:38

    怎么样编辑php.ini
    您想在其中更改变量memory_limit
    如果不够大
    memory_limit = -1或memory_limit = 128M,并且您希望它成为
    内存限制= 768M
    在脚本中

  • 康纳 2015年5月28日,下午3:43

    舍里 是正确的;除了第1行的替换项外,还有一个额外的“Linux” -> “Linux-Unix”在示例1的第4行上进行替换。IT仅应替换第1行上的第一个匹配项,而不替换第4行上的第一个匹配项。

  • 维杰 2015年7月28日,上午10:00

    嗨,有人可以帮我吗,

    我需要更改文件中的键值对:例如
    1.这是第一=真
    2.这是秒=真。

    我只是想改变“1” value to false
    但是第二“2” is also changing
    我在尝试 :
    sed-i -e ‘这是第一个s / true / false /’ myfilename.txt

    两者的价值都在变化..我如何才能只改变一个价值

  • 匿名 2015年10月23日,下午12:18

    从脚本中的用户那里获取文件,要在该文件中搜索的单词以及要用该文件替换的单词时该怎么办?

  • 塞斯·蒂默曼 2016年2月10日,上午3:40

    #9看起来不对。“$sed ‘s/\r\n$/\n/’ filename”应该是安全的替代品’转换为Mac换行符。

  • 马库斯·科尔曼 2016年4月9日,下午5:36

    您好,这是一篇很棒的文章!我无法找到问题的答案

    #从不转发纯名称(不带点或域部分)
    #domain-need
    # Never forward addresses in the non-routed address 空间s.
    #bogus-priv

    sed‘s /#domain-needed / domain-need / g’ 文档名称.conf
    seds /#domain-needed / domain-need / g 文档名称.conf

    sed‘s /#domain-needed / domain-need /’ > 文档名称.conf
    seds /#domain-needed / domain-need / g’/path/to/filename.conf

    sed-n ‘s /#domain-needed / domain-need / gpw输出’ dnsmasq.conf
    伪造的
    但是当我“CAT” it…

    我想念什么。您的帮助将不胜感激。

    提前致谢…

  • 卡提克 2016年4月10日,上午10:22

    嗨,请在这里帮助我,

    我要删除“/opt/app/bss/sieb/fs”文件中所有出现的字符,我需要替换为“/webmaster”. Need syntax

  • 阿伦 2017年1月1日,上午7:59

    你好

    正在尝试删除从特定行号开始的所有空行。但它无法正常工作。谁能帮我吗。

    [root @ localhost〜]#nl passwd
    1个root:x:0:0:root:/ root:/ bin / bash
    2 bin:x:1:1:bin:/ bin:/ sbin / nologin
    3守护程序:x:2:2:daemon:/ sbin:/ sbin / nologin

    4 adm:x:3:4:adm:/ var / adm:/ sbin / nologin

    5 lp:x:4:7:lp:/ var / spool / lpd:/ sbin / nologin

    [[email protected] ~]# sed-e ‘3,/^$/’d passwd
    root:x:0:0:root:/ root:/ bin / bash
    bin:x:1:1:bin:/ bin:/ sbin / nologin
    adm:x:3:4:adm:/ var / adm:/ sbin / nologin

    lp:x:4:7:lp:/ var / spool / lpd:/ sbin / nologin

    [[email protected] ~]# sed-e ‘3,$ /^$/’d passwd
    sed:-e表达式#1,字符5:未知命令:`/’

  • 约翰 2017年1月2日,上午10:35

    阿伦
    Try sed-e ‘3,$ s/^\s*$//;/^$/d’ passwd

    的‘d’是表达式的一部分,必须在刻度线内。你显然也可以’t同时使用地址(3,$)和匹配(/ ^ $ /)。我修改了作者’删除行之前搜索和删除空格(s)的示例。
    祝好运

  • 萨西卡拉 2017年2月24日,上午5:16

    @阿伦

    $ sed‘4,${/^$/d}’ file

    我认为这可能对您有帮助。

  • 定向灵魂 2017年3月16日,下午3:09

    我认为取代所有html标签的10)解决方案是:

    sed“s/]\+>//g”

    希望能帮助到你。

发表评论