簡體   English   中英

將遞減變量傳遞給“sed”命令時出現錯誤的替換錯誤

[英]Bad substitution error when passing decremented variable to “sed” command

我喜歡使用“sed”命令從文件中刪除兩個連續的行。 我可以使用以下語法刪除單行,其中變量“index”包含行號:

sed -i "${index}d" "$PWD$DEBUG_DIR$DEBUG_MENU"

由於我想刪除連續的行,我確實測試了這種語法,據說減少/增加了變量,但是我得到了一個糟糕的替換錯誤。

附錄我不知道在哪里發布這個,但在解決這個問題的過程中,我發現這種語法不能按預期工作

((index ++))nor((index--))

如果您只想要第一個,那么當您看到它時退出:

sed -n "/$choice/ {=;q}" file

但是你看起來好像在多次處理這個文件。 必須有一種更簡單的方法,如果你能描述你的主要目標。

例如,如果你只想刪除匹配的行和下一行,但只是第一次,你可以使用awk:這里我們看到“4”和“5”消失,但“14”和“15”仍然存在:

$ seq 20 | awk '/4/ && !seen {getline; seen++; next} 1'
1
2
3
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

使用GNU sed,您可以使用+1作為地址范圍中的第二個地址:

index=4
seq 10 | sed "$index,+1 d"

或者,如果要使用bash / ksh 算術擴展 :使用后增量運算符

seq 10 | sed "$((index++)),$index d"

請注意,由於管道,sed在子shell中運行:即使索引值現在為5,這也會發生在子shell中。 sed命令結束后,index在當前shell中的值為4。

sed是做s / old / new的正確工具,就是這樣 你想要做的不是那么,那么為什么當你有更合適的工具可以更容易地完成工作時,你是否試圖強迫sed做某事?

正確的方法來做你的腳本:

#retrieve first matching line number
index=$(sed -n "/$choice/=" "$PWD$DEBUG_DIR$DEBUG_MENU")
#delete matching line plus next line from file 
sed -i "/$index[1], (( $index[1]++))/"
"$PWD$DEBUG_DIR$DEBUG_MENU"

似乎試圖這樣做:

awk -v choice="$choice" '$0~choice{skip=2} !(skip&&skip--)' "$PWD$DEBUG_DIR$DEBUG_MENU"

例如:

$ seq 20 | awk -v choice="4" '$0~choice{skip=2} !(skip&&skip--)'
1
2
3
6
7
8
9
10
11
12
13
16
17
18
19
20

如果你只想刪除第一場比賽:

$ seq 20 | awk -v choice="4" '$0~choice{skip=2;cnt++} !(cnt==1 && skip && skip--)'
1
2
3
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

或第二個:

$ seq 20 | awk -v choice="4" '$0~choice{skip=2;cnt++} !(cnt==2 && skip && skip--)'
1
2
3
4
5
6
7
8
9
10
11
12
13
16
17
18
19
20

並跳過5行而不是2行:

$ seq 20 | awk -v choice="4" '$0~choice{skip=5} !(skip&&skip--)'
1
2
3
9
10
11
12
13
19
20

只需使用合適的工具做正確的工作,不要挖洞用茶匙種植樹木。

在單行刪除中使用帶有“索引”的sed連續兩次/順序/工作並解決一些問題。

#delete command line 

sed -i“$ {index} d”“$ PWD $ DEBUG_DIR $ DEBUG_MENU”

#delete description line

sed -i "${index}d" "$PWD$DEBUG_DIR$DEBUG_MENU"

暫無
暫無

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

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