2014-12-13 113 views
0

我是新來的腳本編寫,所以這可能是一個'杜'的問題,也許sed/awk不能這樣做,我需要將用戶輸入的文本行插入到文件中,但必須在特定的唯一行之後插入。有問題的線路,如「###插入新的在下面的輸入HERE」 我一直在使用:試圖理解sed只需要特定文本行的行號

sudo sed -i "9i$userinput from user" ~/filename; 

成功地將用戶輸入加上額外的文本文件行「之後### INSERT NEW INPUT BELOW HERE「這恰好在第8行,所以我硬編碼爲9,但是,事實證明,其他腳本可能會在」### INSERT NEW INPUT BELOW HERE「之前添加或減去此文件中的行螺絲我的一切了......我怎麼可以識別與文本行的行號「###插入新的在下面的輸入HERE」,並將其分配給一個變量,這樣也許是這樣的:

sudo sed -i "$(linenumber + 1)i$userinput from user" ~/filename; 

可能工作。
我已經試過:

line= "### INSERT NEW INPUT BELOW HERE"; 
linenum= sed -n '/$line/'= inputfile; 
echo linenum; 

linenum=$(awk 'NR == "$line"' ./inputfile) 
echo $linenum; 

連同幾個變化,但LINENUM保持爲空。

任何幫助或建議?

回答

1

我會直接匹配行而不是計算數字。最簡單的方法:

awk -v subst="$userinput from user" '{ print } /### INSERT NEW INPUT BELOW HERE/ { print subst }' filename.txt 

然後將其重定向到文件並將其移回。或者,如果您有GNU awk 4.1或更高版本,請使用

awk -i inplace -v subst="$userinput from user" '{ print } /### INSERT NEW INPUT BELOW HERE/ { print subst }' filename.txt 

以應用所做的更改。

說明:

{ print } 

這一個隱含的「匹配任何」在前面(技術上:「匹配空字符串」,這一切都包含),所以這種打印每行。

/### INSERT NEW INPUT BELOW HERE/ { print subst } 

而且在符合### INSERT NEW INPUT BELOW HERE(即,包含字符串)打印變量subst該線,它被設置爲"$userinput from user"-v開關。在斜線之間的東西在技術上是一個正則表達式,但在這種情況下,我們只需要匹配一個靜態字符串,我們不使用任何複雜的功能。

與sed相比,awk更健壯,因爲如果用戶輸入對sed有意義的內容(例如反斜槓),sed將拋出。如果使用-v開關,則awk不存在此問題。

如果你真的只是想號碼,您可以(非常相似)使用

linenum=$(awk '/### INSERT NEW INPUT BELOW HERE/ { print NR }' filename.txt) 
1

我不認爲你的腳本會的工作。如果等號(=)周圍的任何空格用於爲變量賦值,則Bash將失敗。你的sed表達式也是不正確的。或者,也許你只是錯誤輸入,無論如何。

試試這個腳本

line="### INSERT NEW INPUT BELOW HERE"; 
linenum=`sed -n '/'"$line"'/=;q' inputfile` 
echo $linenum; 
+0

爲什麼不只是搜索'$ line'然後** **我的nsert userInput? – shellter 2014-12-13 03:54:59

+0

@ shellter.From問題,似乎OP只想要該行的行號。 – D3Hunter 2014-12-13 03:57:59

+0

這不是我如何解釋O.P.的最終問題。是的,O.P.想要可變的行號,我提供了一個替代方案,只需要一次文件傳遞。我的意思是看GlennJackman的答案。祝你們好運! – shellter 2014-12-13 04:02:24

1

隨着SED,找到行和a PPEND新線

sed -i '/### INSERT NEW INPUT BELOW HERE/a your new line here' file 

(見https://www.gnu.org/software/sed/manual/sed.html#Other-Commands多行插入的複雜性)

例:在「52」後添加一行文字

$ text="this is the new stuff" 
$ seq 50 55 | sed "/52/a $text" 
50 
51 
52 
this is the new stuff 
53 
54 
55 
+0

你需要雙引號而不是單引號:請參閱https://www.gnu.org/software/bash/manual/bashref.html#Quoting – 2014-12-13 15:28:44

+0

好吧,這個工程很漂亮,但是,我搞砸了語法,當我嘗試用這個變量替換用戶輸入中的'new line'。 **即。 sed -i'/ ###在下面插入新的輸入/ a $ emailaddress'$ inputfile **它將文本「$ emailaddress」添加到正確的位置而不是電子郵件地址。我如何強制它擴大變量? – 2014-12-13 15:52:26

+0

非常感謝...現在就像一個魅力工作...更多爲我的片段集合。 2014-12-13 15:56:41

0

您還可以找到並標記行"### INSERT NEW INPUT BELOW HERE"。之後單詞采用這一行並添加換行符「\ n」,然後在換行符後追加新行。

命令

sed 's/^\(### INSERT NEW INPUT BELOW HERE\).$/\1\n$userinput from user/g' ~/filename