2015-11-27 64 views
2

假設我有兩個文件。我如何執行以下操作,即將一個文件中的標記部分複製到另一個文件的某個位置?有些sed命令會完成這項工作嗎?什麼是最實用的方法?複製和粘貼文本分組到另一個文件的優雅方式

文件#1:

This paragraph does not belong to the poem. 

{ begin passage #1 } 

When from a place he run away, 
He never at the place did stay; 
And while he run, as I am told, 
He never stood still for young or old. 

He often squeaked, and sometimes violent, 
And when he squeaked he never was silent. 
Though never instructed by a cat, 
He knew a mouse was not a rat. 

{ end passage #1 } 

This as well does not. 

文件#2:

There was a little guinea pig, 
Who being little, was not big; 
He always walked upon his feet, 
And never fasted when he eat. 

{ input passage #1 file #1 } 

One day, as I am certified, 
He took a whim, and fairly died; 
And as I am told by men of sense, 
He never has been living since. 

我想有從插入文件#2文件#1的通道在給定的標記。幫助和想法都讚賞!

+0

您是否期待'第1段(文件#1)'有不同的值,或者硬編碼的解決方案是否可以接受? – shellter

回答

2

當您問到「最實用的方法是什麼」時,我使用shell腳本將sedawk混合在一起來響應。

試圖解決這個問題只有sed可能是可能的,但不值得花時間弄清楚。

幾乎可以確定進一步的優化,但我試圖編寫可以理解的代碼,而不是一行代碼;-)。

#!/bin/ksh 

sed -n '/^{ begin passage/,/^{ end passage /p' file_1 | sed '/^{/d' > /tmp/$$.segment 

awk -v segFile="/tmp/$$.segment" '{ 
    if ($0 ~ /^{ input passage/) { 
    while (getline <segFile> 0) { 
     print $0 
    } 
    next 
    } 
    else { 
    print $0 
    } 
}' file_2 

rm /tmp/$$.segment 

輸出

There was a little guinea pig, 
Who being little, was not big; 
He always walked upon his feet, 
And never fasted when he eat. 


When from a place he run away, 
He never at the place did stay; 
And while he run, as I am told, 
He never stood still for young or old. 

He often squeaked, and sometimes violent, 
And when he squeaked he never was silent. 
Though never instructed by a cat, 
He knew a mouse was not a rat. 


One day, as I am certified, 
He took a whim, and fairly died; 
And as I am told by men of sense, 
He never has been living since. 

如果需要,可以改變#!/bin/ksh#!/bin/bash

你可以過濾你的輸出以消除重複的空白行,但它不清楚你的最終需求是什麼。

IHTH

+0

我不能拿出* that * sed/awk腳本......很好,再次學到了新的東西! :) – Xiphias

1

這可能爲你工作(GNU SED):

sed -n '/{ begin/,/{ end/!b;//!p' file1 | sed -e '/{ input/r /dev/stdin' -e '//d' file2 

過濾器從文件1行,並將其插入到文件2。第一個sed命令的stdout成爲第二個sed命令的stdin文件。在第二個sed調用中需要兩個sed命令,因爲r命令必須以換行符結尾(或新的-e sed命令)。第二個sed命令刪除第一個文件中的行被插入的行。

+0

少就是多!好的替代品,對於某些人來說,黃金1班輪;-)祝大家好運。 – shellter

相關問題