2014-09-24 44 views
0

數我有一定的行文件,比方說......更換整條生產線正從可變

AAA BBB CCC 

我需要更換整條生產線,發現它之後,所以我做:

q1=`grep -Hnm 1 "AAA" FILE | cut -d : -f 2` 

輸出我第一次出現(在q1)的行號,因爲它有不止一次出現,現在,這裏出現我的問題...在上一步中,我使用此sed來替換某一行在文件中:

sed -e '3s/.*/WHATEVER/' FILE 

要更換(在本例中,3號線)與任何完整的線,但現在如果我嘗試使用$ Q1,而不是「3」表示該行號這是行不通的:

sed -e '$q1s/.*/WHATEVER/' FILE 

這可能是一個愚蠢的語法錯誤,任何幫助是值得歡迎的;在此先感謝

+0

而不是使用''grep'和cut'的' sed',爲什麼不使用'awk'? – 2014-09-24 18:55:23

回答

0

嘗試: sed -e '${q1}s/.*/WHATEVER/' FILE

+0

愛你的兄弟,工作就像一個魅力!非常感謝! – Ghost 2014-09-24 17:47:01

+1

更好地使用雙引號而不是單引號,因此可以擴展shell變量。 – 2014-09-24 17:49:13

+0

是的,也是這樣= = – Ghost 2014-09-24 18:57:59

0

我會用awk爲此:

awk '/AAA/ && !r {print "WHATEVER"; r=1; next} {print}' <<END 
a 
b 
AAA BBB CCC 
d 
e 
AAA foo bar 
f 
END 
a 
b 
WHATEVER 
d 
e 
AAA foo bar 
f 
+0

awk對sed有什麼好處? – Ghost 2014-09-24 18:02:42

+0

您可以在awk中使用變量,而不是sed。所以你可以知道它是否是你第一次看到這種模式。 – 2014-09-24 18:07:14

0

如果要替換文件中的字符串的第一次出現,你可以使用這個awk腳本:

awk '/occurrence/ && !f++ {print "replacement"; next}1' file 

替換將僅在第一次打印,因爲!f++只會評估爲真(在隨後的評估中,f將大於零,因此!f將爲false。最後的1總是如此,所以對於除匹配的行以外的每一行,awk都執行默認操作並打印行。

測試出來:

$ cat file 
blah 
blah 
occurrence 1 and some other stuff 
blah 
blah 
some more stuff and occurrence 2 
blah 
$ awk '/occurrence/ && !f++ {print "replacement"; next}1' file 
blah 
blah 
replacement 
blah 
blah 
some more stuff and occurrence 2 
blah 

的「更新換代」的字符串可以很容易地設置一個shell變量的下列方式值:

awk -v rep="$r" '/occurrence/ && !f++ {print rep; next}1' file 

其中$r是一個shell變量。

使用與上面相同的文件和實例變量在您的評論:

$ q2="x=\"Second\"" 
$ awk -v rep="$q2" '/occurrence/ && !f++ {print rep; next}1' file 
blah 
blah 
x="Second" 
stuff 
blah 
blah 
some more stuff and occurrence 2 
blah 
+0

遇到這個問題...在這種情況下,我的「替換」是一個變量q2 =「x = \」Second \「」,但是替換時只寫入「Second」而不是存儲在q2處的完整字符串。 – Ghost 2014-09-24 19:06:43

+0

這很奇怪,它適用於我,請參閱我的答案的更新。 – 2014-09-24 19:11:12

+0

現在完美更新!而且是的,看起來awk可以節省很多線條,但我仍然不是專家;)。非常感謝!!! – Ghost 2014-09-24 19:42:48

0
sed "${q1} c\ 
WHATEVER" YourFile 

,但你可以直接使用

sed '/YourPatternToFound/ {s/.*/WHATEVER/ 
:a 
N;$!ba 
}' YourFile