0

我有一个通过 shell 脚本修改的文本文件。

我需要执行以下操作:

  1. 从用户那里获取新文本的输入。
  2. 在文件中搜索关键字#1。
  3. 从 2. 开始,向前搜索关键字#2。
  4. 用用户提供的输入替换该行(包含关键字 #2)。

例如,我的文件有以下文本:

(some text)  
(some text)  
(text1_to_search)  
(some text)  
(text2_to_search) <- **This needs to be replaced only**  
(text2_to_search)    
(some text)

我只需要替换该特定行并保持其余文件内容不变。

4

2 回答 2

2

这是一种方法

awk '/text1_to_search/,/text2_to_search/ && !found{
if($0 ~ /text1_to_search/){found=0};
if($0 ~ /text2_to_search/){print "replacement";found=1;next}};
{print}'

对于两个不重叠的搜索/替换

awk '/text1_to_search/,/text2_to_search/ && !found{if($0 ~ /text1_to_search/){found=0};if($0 ~ /text2_to_search/){print "replacement";found=1;next}};
/Search_String2/,/Search_String3/ && !found2{if($0 ~ /SearchString2/){found2=0};if($0 ~ /Search_String3/){print "replacement2";found2=1;next}};
{print}' 
于 2013-06-27T12:58:58.217 回答
0
awk 'done{print;next}found&&/text2/{while(getline<"replacement")print;done=1;next}/text1/{found=1}1'

这假设您有一个名为“replacement”的替换文件。以下两个通过正则表达式替换:

sed '/text1/,/text2/s/text2/foo/' test.in

如果它们在同一行,这将替换那个和下一个。以下只会改变后一个。

awk 'found&&!done&&/text2/{done=sub(/text2/,"foo")}/text1/{found=1}1' test.in
于 2013-06-27T13:01:08.267 回答