簡體   English   中英

如何刪除sed中給定變量的行?

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

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