簡體   English   中英

使用bash中的可變行號更改文本的特定行

[英]Change specific line of text using variable line number in bash

我正在為家用服務器運行一個項目,我需要在其中更改配置文件中特定行上的文本。 我需要更改的行具有一個具有不同值的唯一屬性名稱,但是有時會將新行添加到文件中,導致我要更改的行的位置不時地移動。 為了編寫和測試腳本,我在電腦上選擇了一個隨機的配置文件,看起來像這樣

# cat kvirc4.ini
# KVIrc configuration file
[Main]
LocalKvircDirectory=C:\Users\Aulus\AppData\Roaming\KVIrc4\
SourcesDate=538186288

我編寫了一個腳本,將第三行的內容更改為“ changed”。 如果我這樣編寫腳本,直接在腳本中指定行號,則該輸出文件將按預期工作,即輸出文件顯示源文件中更改了這一行的內容。

# cat bashscript.sh
#!/bin/bash
awk '{ if (NR == 3) print "different"; else print $0}' kvirc4.ini.bak >   output

但是,一旦添加命令以查找行號並將其保存到在awk中用於指定行腳本的變量中,就不再對該行進行更改,而保留了文件的原始版本。 我添加了您在下面看到的回聲,以確認我的變量具有正確的值並且確實如此。 在我看來,問題很明顯是我的awk命令沒有正確讀取行號,從而導致if語句保持為false,但是我對bash和awk還是有點陌生​​,所以我不確定如何解決它。 誰能提供建議以幫助我找到解決方案?

# cat bashscript.sh
#!/bin/bash
lineno=$(awk '/LocalKvircDirectory/{ print NR; exit }'  kvirc4.ini.bak);lineno=$(printf '%b' $lineno)
echo $lineno
# awk 'NR==$lineno {$0="changed"} { print }' kvirc4.ini.bak
awk '{ if (NR == "$lineno") print "different"; else print $0}' kvirc4.ini.bak > output

您正在awk代碼中使用bash參數擴展樣式( "$lineno" ),與該文件無關。

您的"$lineno"永遠不會擴展,因為它是單引號。

您有幾種選擇:

  1. 您可以使用不同的引號來使"$lineno"起作用:

     awk '{ if (NR == '"$lineno"') print ··· 
  2. 在命令行中使用awk變量初始化

     awk -v lineno="$lineno" '{ if (NR==lineno) print ··· 
  3. 使用ENVIRON awk數組獲取已導出(即在環境中)的bash變量的值:

     export lineno awk '{ if (NR==ENVIRON["lineno"]) print ··· 

暫無
暫無

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

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