[英]How to to delete a line given with a variable in sed?
我正在嘗試使用sed
從名稱存儲在變量中的文件中刪除一行,從用戶輸入中讀取。 現在sed
所做的只是打印該行而不是其他任何內容。
這是我正在使用的命令的代碼片段:
FILE="/home/devosion/scripts/files/todo.db"
read DELETELINE
sed -e "$DELETELINE"'d' "$FILE"
有什么我在這里想念的嗎?
編輯:用-i
切換-e
選項解決了我的問題!
您需要對搜索進行定界。
#!/bin/bash
read -r Line
sed "/$Line/d" file
將刪除包含鍵入的輸入的任何行。
請記住,盡管 sed 匹配正則表達式,但任何特殊字符都將被視為此類。
例如,搜索1*
實際上會刪除包含任意數量的 1 而不是實際的 1 和星號的行。
還要記住,當變量擴展時,它不能包含分隔符,否則命令會中斷或產生未擴展的結果。
例如,如果“$Line”包含“/hello”,那么 sed 命令將失敗並顯示sed: -e expression #1, char 4: extra characters after command
。
在這種情況下,您可以轉義/
或使用不同的分隔符。
我個人會為此使用 awk
awk -vLine="$Line" '!index($0,Line)' file
它搜索確切的字符串並且沒有 sed 命令的缺點。
您可能會成功使用 grep 而不是 sed
read -p "Enter a regex to remove lines: " filter
grep -v "$filter" "$file"
就地存儲需要更多的工作:
tmp=$(mktemp)
grep -v "$filter" "$file" > "$tmp" && mv "$tmp" "$file"
或者,用sponge
grep -v "$filter" "$file" | sponge "$file"
注意:嘗試改掉使用 ALLCAPSVARS 的習慣:有一天你會不小心使用PATH=...
然后想知道為什么你的腳本被破壞了。
請試試這個:
sed -i "${DELETELINE}d" $FILE
我發現了這一點,它允許使用變量進行范圍刪除:
#!/bin/bash
lastline=$(whatever you need to do to find the last line)` //or any variation
lines="1,$lastline"
sed -i "$lines"'d' yourfile
keeps it all one util.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.