Maison  >  Article  >  Opération et maintenance  >  Explication détaillée de l'exemple de partage de code pour la commande sed sous Linux

Explication détaillée de l'exemple de partage de code pour la commande sed sous Linux

黄舟
黄舟original
2017-06-07 10:26:161517parcourir

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.

sed utilise des paramètres

[root@www ~]# sed [-nefr] [动作]

Options et paramètres :

-n : Utiliser le mode silencieux. Lors d'une utilisation normale de sed, toutes les données provenant de STDIN sont généralement répertoriées dans le terminal. Mais si le paramètre -n est ajouté, seule la ligne (ou action) spécialement traitée par sed sera répertoriée.

-e : Modifiez les actions sed directement en mode ligne de commande ;

-f : Écrivez directement les actions sed dans un fichier, -f fichier nom, vous pouvez exécuter le action sed dans le nom de fichier ;

-r : l'action sed prend en charge la syntaxe de notation régulière étendue. (La valeur par défaut est la syntaxe de notation régulière de base)

-i : modifiez directement le contenu du fichier lu au lieu de le sortir sur le terminal.

Description de l'action : [n1[,n2]]fonction

n1, n2 : peut ne pas exister, représente généralement "sélectionner le nombre de lignes pour l'action", par exemple, si mon L'action doit être effectué entre 10 et 20 lignes, puis 『10,20[actioncomportement]』

fonction :

a :nouveau , a peut être suivi de chaînes, et ces chaînes apparaîtront sur une nouvelle ligne (la ligne suivante actuelle)~

c : à la place, c peut être suivi de chaînes, et ces chaînes peuvent remplacer les lignes entre n1 et n2 !

d : Supprimer, car il s'agit d'une suppression, donc d n'est généralement suivi d'aucun dong dong

i : Insérer, je peux être suivi d'une chaîne, et Ces chaînes apparaîtront sur une nouvelle ligne (la ligne précédente actuelle

p : Imprimer, c'est-à-dire imprimer une donnée sélectionnée); Habituellement, p sera exécuté avec le paramètre sed -n~

s : remplacement, vous pouvez directement effectuer le travail de remplacement ! Habituellement, cette action peut être associée à une notation régulière ! Par exemple, 1,20s/ancien/nouveau/g C'est tout !

Ajouter/supprimer des unités de ligne

Listez le contenu de /etc/passwd et imprimez le numéro de ligne 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 2ème ligne

nl /etc/passwd | sed '2d'

Pour supprimer la 3ème jusqu'à la dernière ligne

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

Après la deuxième ligne (c'est-à-dire, ajoutez-la à la troisième line ) plus les mots « nouvelle ligne de texte ? » !

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

Ensuite, si vous souhaitez remplacer et afficher en unités de ligne avant la deuxième ligne

nl /etc/passwd | sed '2i new line text'

remplacez le contenu des lignes 2 à 5 par Et qu'en est-il "Pas de numéro 2-5" ?

[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 lister le contenu d'un certain fichier. Certain les numéros de ligne sont sélectionnés pour l’affichage.

Rechercher et afficher les données

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

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
....下面忽略

Si la racine est trouvée, sauf afficher toutes les lignes , les lignes correspondantes seront également affichées.

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 la racine 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已经删除了

Rechercher et exécuter des commandes pour les données

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

recherchez /etc/passwd, trouvez la ligne correspondant à root et exécutez un ensemble de commandes entre accolades, chaque commande séparée par un point-virgule, remplacez bash par blueshell ici, 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, exit

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.

Rechercher et remplacer des données

En plus du mode de traitement de ligne complet, sed peut également rechercher et remplacer des données partielles à l'aide d'unités de ligne. Fondamentalement, les recherches et substitutions de sed sont assez similaires à celles de vi ! Cela ressemble un peu à ceci :

sed 's/string to be replace/new string/g'

Observez d'abord les informations d'origine et utilisez /sbin/if config Requête 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