Linux Three Musketeers ~ Verwendung des sed-Befehls

1. Funktionsprinzip:

  • sed ist ein Stream-Editor, der ein sehr nützliches Werkzeug in der Textverarbeitung ist

  • Es kann perfekt mit regulären Ausdrücken verwendet werden. Während der Verarbeitung wird die aktuell verarbeitete Zeile in einem temporären Puffer, dem sogenannten Musterraum, gespeichert und dann wird der Befehl sed verwendet, um den Inhalt im Puffer zu verarbeiten.

  • Nach Abschluss der Verarbeitung wird der Inhalt des Puffers an den Bildschirm gesendet. Verarbeiten Sie dann die nächste Zeile und wiederholen Sie den Vorgang bis zum Ende der Datei. Der Dateiinhalt hat sich nicht geändert

  • Merkmale von sed:

    • Der Befehl sed eignet sich ideal zum Anwenden einer Reihe von Bearbeitungsbefehlen auf einen Textstapel

    • Der Befehl sed ist ein nicht interaktiver Texteditor, der Text aus Textdateien und Standardeingaben bearbeiten kann. Unter diesen kann die Standardeingabe Text über die Tastatur, Dateiumleitung, Zeichenfolge, Variable oder Pipe sein.

    • Der Befehl sed liest jeweils eine Datenzeile aus der Datei oder der Standardeingabe, kopiert sie in einen Puffer (bis zu 8192 Byte) und liest dann den Bearbeitungsunterbefehl der Befehlszeile oder des Skripts, um die Textzeilen im Puffer zu bearbeiten. Wiederholen Sie diesen Vorgang, bis alle Textzeilen verarbeitet wurden

2.sed grundlegende Syntax:

  • Grammatik:

    sed OPTIONS… [SCRIPT] [INPUTFILE…]

  • Parameter:

    Häufig verwendete Optionen veranschaulichen
    -n, --ruhig, --still Nur übereinstimmende Zeilen drucken
    -ich Bearbeiten Sie die Originaldatei direkt, anstatt sie auf dem Bildschirm auszugeben. Die Originaldatei wird standardmäßig nicht bearbeitet< a i=3>;
    -Es ist Führen Sie die Bearbeitung von Sed-Aktionen direkt im Befehlszeilenmodus durch, ohne die Originaldatei zu ändern.
    -R Verwenden Sie erweiterte reguläre Ausdrücke
    -F Schreiben Sie die Sed-Aktion direkt in eine Datei. -f Dateiname kann die Sed-Aktion in Dateiname ausführen.
    [root@quruixiang ~]# sed -n '3p' /etc/passwd

3. Bearbeitungsvorgänge im Musterbereich:

  • Adresstrennung: (Abfrage)

    # 1)#:#为数字,指定要进行处理操作的行;1,表示第一行;
    [root@quruixiang ~]# sed -n '3,4p' /etc/passwd
    ​
    # 2)$:表示最后一行,多个文件进行操作的时候,为最后一个文件的最后一行;
    [root@quruixiang shellstudy]# sed -n '$p' test8.sh
    ​
    # 3)/regexp/:表示能够被regexp匹配到的行;
    [root@quruixiang ~]# sed -n "/test/p" /etc/passwd
    ​
    ## regexp即基于正则表达式的匹配;
    # 4)/regexp/I:匹配时忽略大小写;
    [root@quruixiang shellstudy]# sed -n "/test/Ip" /etc/passwd
    ​
    # 5)\%regexp%: 任何能够被regexp匹配到的行,换用%(用其他字符也可以,如:#)为边界符号;
    [root@quruixiang shellstudy]# sed -n "\%echo%p" test8.sh
    ​
    # 6)addr1,addr2:指定范围内的所有的行(范围选定);
    [root@quruixiang ~]# sed -n "3,6p" /etc/passwd
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    ​
    # 常用地址定界表示方式:
    ## a)0,/regexp/:从起始行开始到第一次能够被regexp匹配到的行。
    [root@quruixiang shellstudy]# sed -n "0,/bin/p" test8.sh 
    ​
    ## b)/regexp/,/regexp/:被模式匹配到的行内的所有的行。
    ## 7)first~step:指定起始的位置及步长,例如:1~2表示1,3,5…
    [root@quruixiang shellstudy]# sed -n "1~3p" test8.sh 
    #!/bin/bash
    #Version:v1.0
    #Description:
    func()
            echo 1
        fi    
    echo $result
     
    ## 8)addr1,+N:指定行以及以后的N行;
    [root@quruixiang ~]# sed -n "3,+4p" /etc/passwd
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    ​
    ### addr1,~N:addr1开始的行,N结束的行
    [root@quruixiang ~]# sed -n "3,~4p" /etc/passwd
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin

  • Vorsichtsmaßnahmen:

    • Wenn keine Adresse angegeben ist, wird der Befehl auf jede Zeile angewendet

    • Wenn nur eine Adresse vorhanden ist, bedeutet dies, dass der Befehl auf alle Leitungen angewendet wird, die dieser Adresse entsprechen.

    • Wenn zwei durch Komma getrennte Adressen angegeben werden, bedeutet dies, dass der Befehl auf die Zeilen angewendet werden soll, die mit der ersten Adresse und der zweiten Adresse (einschließlich) übereinstimmen.

    • Wenn auf eine Adresse ein Ausrufezeichen folgt, bedeutet dies, dass der Befehl auf alle Zeilen angewendet wird, die nicht mit der Adresse übereinstimmen.

  • Häufig verwendete Bearbeitungsbefehle: (Bearbeiten)

    # 1)d:删除匹配到的行
    [root@quruixiang shellstudy]# sed '3d' test8.sh
    [root@quruixiang shellstudy]# sed '/echo/d' test8.sh
    [root@quruixiang shellstudy]# sed '/^$/d' test8.sh     # 删除空行
    ​
    # 2)p:打印当前模式空间内容
    [root@quruixiang shellstudy]# sed '/echo/p' test8.sh
    ​
    # 3)a \text:append,表示在匹配到的行之后追加内容
    [root@quruixiang shellstudy]# sed '$a\system' test8.sh
    [root@quruixiang shellstudy]# sed '3a\systemctl' test8.sh
    [root@quruixiang shellstudy]# sed '/echo/a\systemctl' test8.sh
    ​
    # 4)i \text:insert,表示在匹配到的行之前追加内容
    [root@quruixiang shellstudy]# sed '3i\sys' test8.sh
    [root@quruixiang shellstudy]# sed '/echo/i\sys' test8.sh
    ​
    # 5)c \text:change,表示把匹配到的行和给定的文本进行交换
    [root@quruixiang shellstudy]# sed '/echo/c\system' test8.sh
    ​
    # 6)s/regexp/replacement/flages:查找替换,替换regexp匹配到的内容(其中/可以用其他字符代替,
    sed -i '/^SELINUX=/ s/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 
    [root@quruixiang shellstudy]# sed 's/fun/##/1' test8.sh      # 替换每行中第一个匹配的fun替换为##
        ## 例如@)
        ## 其他编辑命令:
        ## 常用的flages:
        ## g:全局替换,默认只替换第一
        [root@quruixiang shellstudy]# sed 's/echo/system/g' test8.sh
        [root@quruixiang shellstudy]# sed 's/^/##/g' test8.sh        # 文件中的每一行开头加一个##
        [root@quruixiang shell]# sed -i 's/^#[[:space:]]*//g' test.txt      # 删除开头#和至少一个空字符的行 
        ## i: 不区分大小写
        ## p:如果成功替换则打印
        [root@quruixiang shellstudy]# sed 's/echo/system/p' test8.sh
        
    # 7)r 读入文件内容追加到匹配行后面
    [root@quruixiang shellstudy]# sed  'r 2.txt'  1.txt        # 在1.txt中的每一行后都写入2.txt的内容
    [root@quruixiang shellstudy]# sed '3r 2.txt'  1.txt        # 在1.txt中的第3行后写入2.txt的内容
    [root@quruixiang shellstudy]# sed  '/245/r 2.txt'   1.txt    # 在1.txt中的匹配行后写入2.txt的内容
    ​
    # 8)R 读入文件一行内容追加到匹配行后面
    # 9)y :y/source/dest/ 固定长度替换,要求替换的字符串长度相等
    # 10)w /path/to/somefile:将匹配到的文件内容追加到指定的文件末尾 
    [root@quruixiang shell]# sed -n 'w test.txt' passwd        # 在test.txt的末尾0后写入passwd的内容

4. SED-Erweiterung:

spezielle Symbole veranschaulichen
Wendet den Befehl auf alle Zeilen außer den angegebenen Zeilen an
= Gibt die aktuelle Zeilennummer aus
~ „erster Schritt“ bedeutet, von der ersten Zeile aus zu beginnen und schrittweise zu steigern.
&Ampere; Stellt den zu ersetzenden Inhalt dar
; Implementieren Sie eine Zeile mit Befehlsanweisungen, um mehrere sed-Befehle auszuführen
{} Führen Sie Massenvorgänge für eine einzelne Adresse oder einen einzelnen Adressbereich durch
+ Im Adressbereich verwendete Symbole für Additionsoperationen
# 打印匹配到echo的行号
[root@quruixiang shellstudy]# sed -n '/echo/=' test8.sh
# 打印最后一行的行号
[root@quruixiang shellstudy]# sed -n '$=' test8.sh 
# 删除3之外的所有行
[root@quruixiang shellstudy]# sed '3!d' test8.sh    
# 删除1~3之外的所有行
[root@quruixiang shellstudy]# sed '1,3!d' test8.sh
# 删除匹配到fi到最后一行之外的所有行
[root@quruixiang shellstudy]# sed '/fi/,$!d' test8.sh
# 删除从匹配fi的行到最后一行
[root@quruixiang shellstudy]# sed '/fi/,+1d' test8.sh
# 删除匹配echo或fi的行
[root@quruixiang shellstudy]# sed '/echo\|fi/d' test8.sh
# 删除1~3行中,匹配内容bin的行
[root@quruixiang shellstudy]# sed '1,3{/bin/d}' test8.sh
# 打印匹配echo的行的行号和内容
[root@quruixiang shellstudy]# sed -n '/echo/{=;p}' test8.sh
# 打印3行到10行的内容
[root@quruixiang shell]# sed -n '3,10{=;p}' test.txt 
 

Ich denke du magst

Origin blog.csdn.net/qq_56776641/article/details/133943511
Empfohlen
Rangfolge