簡體   English   中英

Linux SED 腳本找到匹配模式的第一行並將其刪除

[英]Linux SED script find the 1st line that match pattern and delete it

我想創建一個 sed 命令以在文件中查找與模式匹配的第一行並刪除所有該行或將其全部替換為其他文本。 我不想匹配所有行,因為規則是匹配其中的一部分。

我怎么能用 sed 做到這一點?

例如:

myline 1 is pretty
line 2 is ugly
myline 111 is nice

我想刪除包含“1 is”的第一行

更新:我的行可能有像“/”和“<”這樣的字符

問候法克

來自sed常見問題解答

sed '0,/RE/{//d;}' file        # delete only the first match
sed '0,/RE/s//to_that/' file   # change only the first match

如果您沒有使用 GNU sed ,請查看常見問題解答中的替代方案。

我傾向於將awk用於更復雜的任務,它比sed更強大,具有適當的循環和選擇結構(為提高可讀性而擴展,如果您願意,可以將其壓縮回一行):

pax$ echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice'  | awk '
     /1 is/ {if (f) {print} else {f = 1}}
    !/1 is/ {print}'

xyz
line 2 is ugly
myline 111 is nice

對於與模式匹配的任何行( !/1 is/ ),它只會打印它。

對於與模式匹配的行,如果設置了標志f (最初未設置),它將全部打印出來。 當未設置標志並且遇到匹配行時,它會設置標志並且不打印它。 這基本上會根據需要刪除第一條匹配行。

如果要修改第一個匹配行而不是刪除它,只需在f = 1旁邊插入代碼即可,例如:

pax$ echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice'  | awk '
     /1 is/ {if (f) {print} else {f = 1;print "URK!!!"}}
    !/1 is/ {print}'

xyz
URK!!!
line 2 is ugly
myline 111 is nice

要在awk中使用 shell 變量,您可以使用-v選項將其作為真正的awk變量傳遞:

pax$ export xyzvar=URK ; echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice'  | awk -vmyvar=$xyzvar '
     /1 is/ {if (f) {print} else {f = 1;print myvar}}
    !/1 is/ {print}'

xyz
URK
line 2 is ugly
myline 111 is nice

您可以在沒有 sed 的情況下完成它。 Bash 腳本:

LINE=$(grep -n "$EXPR" "$FILE" |head -1 |cut -f1 -d:)
head -$(expr $LINE - 1 ) $FILE
tail +$(expr $LINE + 1 ) $FILE

只需聲明$EXPR$FILE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM