Maison  >  Article  >  Opération et maintenance  >  Explication détaillée de l'utilisation de sed

Explication détaillée de l'utilisation de sed

大家讲道理
大家讲道理original
2017-05-28 10:24:142148parcourir

Introduction

sed est un éditeur en ligne qui traite le contenu une ligne à la fois. Pendant le traitement, la ligne en cours de traitement est stockée dans un tampon temporaire, appelé « espace de modèle », puis la commande sed est utilisée pour traiter le contenu du tampon. Une fois le traitement terminé, le contenu du tampon est envoyé au tampon. écran. Traitez ensuite la ligne suivante et répétez jusqu'à la fin du fichier. Le contenu du fichier n'est pas modifié sauf si vous utilisez la redirection pour stocker la sortie. Sed est principalement utilisé pour éditer automatiquement un ou plusieurs fichiers ; simplifier les opérations répétées sur les fichiers ; écrire des programmes de conversion, etc.

paramètres sed utilisés


Explication détaillée de lutilisation de sed

[root@www ~]# sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』

function:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

Explication détaillée de lutilisation de sed

Ajouter/supprimer dans les lignes


will/ Le contenu de etc/passwd sont répertoriés et les numéros de ligne sont imprimés en même temps, veuillez supprimer les lignes 2 à 5 !


[root@www ~]# nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.....(后面省略).....



L'action de sed est '2,5d', c'est à dire la suppression ! Parce qu'il a supprimé les lignes 2 à 5, les données affichées n'incluent pas les lignes 2 à 5 ~ De plus, veuillez noter qu'à l'origine vous auriez dû émettre sed -e, mais cela fonctionnera sans -e ! Dans le même temps, il convient également de noter que les actions qui suivent sed doivent être entourées de deux guillemets simples '' !

Supprimez simplement la ligne 2


nl /etc/passwd | sed '2d'


Pour supprimer la ligne 3 jusqu'à la fin Une ligne


 nl /etc/passwd | sed '3,$d'


est ajoutée après la deuxième ligne (c'est-à-dire ajoutée à la troisième ligne ) Les mots « boire du thé ? » sont écrits dessus !


[root@www ~]# nl /etc/passwd | sed '2a drink tea'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....


Si c'est avant la deuxième ligne,


 nl /etc/passwd | sed '2i drink tea'


Si vous souhaitez ajouter plus de deux lignes, ajoutez deux lignes après la deuxième ligne, par exemple « Boire du thé ou.. ." ...' et « boire de la bière ? »


Explication détaillée de lutilisation de sed

[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....

Explication détaillée de lutilisation de sed

Un antislash 『 』 doit être utilisé entre chaque ligne pour ajouter une nouvelle ligne ! Ainsi, dans l’exemple ci-dessus, nous pouvons trouver qui existe à la fin de la première ligne.


Remplacer et afficher en unités de ligne


Remplacer le contenu des lignes 2 à 5 par "No 2-5 number" ?


[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
.....(后面省略).....



Grâce à cette méthode, nous pouvons remplacer toute la ligne de données !

Ne listez que les lignes 5 à 7 dans le fichier /etc/passwd


[root@www ~]# nl /etc/passwd | sed -n '5,7p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


Vous pouvez utiliser la fonction d'affichage ligne par ligne de sed pour sélectionner et afficher certains numéros de ligne dans un fichier.

Rechercher et afficher des données

Rechercher les lignes /etc/passwd avec le mot-clé racine


Explication détaillée de lutilisation de sed

nl /etc/passwd | sed '/root/p'
1  root:x:0:0:root:/root:/bin/bash
1  root:x:0:0:root:/root:/bin/bash
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
4  sys:x:3:3:sys:/dev:/bin/sh
5  sync:x:4:65534:sync:/bin:/bin/sync
....下面忽略

Explication détaillée de lutilisation de sed

Si la racine est trouvée, sauf la sortie Tout lignes, les lignes correspondantes sont également sorties.

Lors de l'utilisation de -n, seules les lignes contenant le modèle seront imprimées.


nl /etc/passwd | sed -n '/root/p'
1  root:x:0:0:root:/root:/bin/bash


Rechercher et supprimer des données

Supprimer toutes les lignes contenant root dans /etc/passwd, et afficher les autres lignes


nl /etc/passwd | sed  '/root/d'
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
....下面忽略
#第一行的匹配root已经删除了


Recherchez des données et exécutez la commande

Après avoir trouvé la ligne correspondant au modèle oriental,

recherchez /etc/passwd et trouvez la ligne racine correspondante, exécutez un ensemble de commandes entre accolades, séparées par des points-virgules. Ici, remplacez bash par blueshell, puis affichez cette ligne :


 nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
 1  root:x:0:0:root:/root:/bin/blueshell

<.>

Si vous remplacez uniquement le premier mot-clé bash de /etc/passwd par blueshell, alors

Quitter


nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'    
1  root:x:0:0:root:/root:/bin/blueshell


Le dernier q est de sortir.

数据的搜寻并替换

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:


sed 's/要被取代的字串/新的字串/g'


 

先观察原始信息,利用 /sbin/ifconfig 查询 IP


[root@www ~]# /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.....(以下省略).....



本机的ip是192.168.1.100。

 

将 IP 前面的部分予以删除


[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0


接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

将 IP 后面的部分予以删除


[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100


 

多点编辑

一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell


nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1  root:x:0:0:root:/root:/bin/blueshell
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh


-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。

 

 

直接修改文件内容(危险动作)


sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!

利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !


[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt


 

利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』


[root@www ~]# sed -i '$a # This is a test' regular_express.txt


由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!

sed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn