[英]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.