2012-03-06 80 views
9

在Linux中,我可以使用什麼命令來用新的多行替換單行文本?我想在一行中查找關鍵字並刪除此行,並用多行新行替換它。因此,在下面顯示的文本中,我想要搜索包含「keyword」的行,並用如下所示的3行新文本替換整行。用多行文本替換單行

例如更換包含該關鍵詞的線,

This is Line 1 
This is Line 2 that has keyword 
This is Line 3 

改變爲這樣:

This is Line 1 
Inserted is new first line 
Inserted is new second line 
Inserted is new third line 
This is Line 3 
+2

你打算更換一個特定的行號或符合「^這是行2 $」的行嗎?任何一個都可以用sed – technosaurus 2012-03-06 00:09:39

+0

完成行匹配。我不太清楚如何用sed顯示的多行替換單個匹配行。 – SSS 2012-03-06 00:18:09

+1

爲了清晰起見,我更新了原文。 – SSS 2012-03-06 00:26:58

回答

12
$ sed '/keyword/c\ 
> Inserted is new first line\ 
> Inserted is new second line\ 
> Inserted is new third line' input.txt 

This is Line 1 
Inserted is new first line 
Inserted is new second line 
Inserted is new third line 
This is Line 3 

$>是bash提示符

+2

你是如何計時的,以便在一個小時過去之後沒有人回答這個問題,你就可以在提前一分鐘提交你的答案! – 2012-03-06 01:22:07

+2

純屬巧合 – kev 2012-03-06 01:30:44

+1

謝謝!這讓我蝙蝠瘋狂b/c'\ n'不工作。 – SaxDaddy 2014-09-19 20:43:26

8

創建一個文件,script.sed,包含:

/keyword/{i\ 
Inserted is new first line\ 
Inserted is new second line\ 
Inserted is new third line 
d 
} 

它應用到您的數據:

sed -f script.sed your_data 

有關於如何做到這一點,使用ca命令,而不是i和/或d許多變化,但是這是合理的清潔。它找到關鍵字,插入三行數據,然後刪除包含關鍵字的行。 (該c命令執行,所有的,但我不記得它的存在,而a命令追加文本,並與i基本上是同義的在這方面。)

+0

可以將它嵌入到單個bash腳本中嗎?我寧願將它保存到一個文件。 – flickerfly 2015-05-16 01:57:58

+1

@flickerfly:是的,它可以在沒有單獨文件的情況下完成。儘管如此,文件通常更容易。它部分取決於插入的內容,但是如果它們包含諸如「他說的」這樣的文本,「不要這樣做!即使是100美元,也不要這樣做。」,在shell腳本中處理它變成一個真正的痛苦(你必須以某種方式逃避某些引用),但是對於單獨的'script.sed'文件來說,這幾乎是微不足道的。對於純文本,只需將所有腳本放在單引號內。你需要反斜槓 - 'sed'必須看到它們。如果您必須使用雙引號,則需要將反斜槓加倍。 – 2015-05-16 02:04:57

+1

順便說一下,[kev](http://stackoverflow.com/users/348785/kev)的[answer](http://stackoverflow.com/a/9576547/15168)顯示瞭如何在一個單一的腳本,如果替換文本包含引號字符,可能不需要廣泛討論這些詭計。 – 2015-05-16 02:09:42

1

您可以使用shell內建也做到這一點:

STRING1_WITH_MULTIPLE_LINES="your 
text 
here" 

STRING2_WITH_MULTIPLE_LINES="more 
text" 

OUTPUT="" 
while read LINE || [ "$LINE" ]; do 
    case "$LINE" in 
    "Entire line matches this")OUTPUT="$OUTPUT$STRING1_WITH_MULTIPLE_LINES 
";; 
    *"line matches this with extra before and/or after"*)OUTPUT="$OUTPUT$STRING2_WITH_MULTIPLE_LINES 
";; 
    *)OUTPUT="$OUTPUT$LINE 
";; 
    esac 
done < file 
echo "$OUTPUT" >file 
+1

你不必將字符串設置爲while-read-case塊之外的變量......它們只能是OUTPUT =「$ OUTPUTyour \ ntext \ nhere」...用實際的新行代替\ n – technosaurus 2012-03-06 17:53:46