用不同的值替换相同文本的第一次和第二次出现

时间:2011-04-08 17:45:16

标签: regex bash shell sed sh

我正在寻找一种方法,用$ {A}替换文本文件中第一次出现的某个文本,并使用$ {B}替换同一文本的第二次出现在另一行上。这可以用sed或awk或任何其他UNIX工具实现吗?

工具集相当有限:bash,常见的UNIX工具,如sed,grep,awk等。不能使用Perl,Python,Ruby等......

提前感谢任何建议 罗伯特

示例:

...
Text
Text
Text
Text
TEXT_TO_BE_REPLACED
Text
Text
Text
TEXT_TO_BE_REPLACED
Text
Text
Text
...

应替换为

...
Text
Text
Text
Text
REPLACEMENT_TEXT_A
Text
Text
Text
REPLACEMENT_TEXT_B
Text
Text
Text
...

6 个答案:

答案 0 :(得分:3)

Sed一次运行:


sed -e 's/\(TEXT_TO_BE_REPLACED\)/REPLACEMENT_TEXT_A/1' \
    -e 's/\(TEXT_TO_BE_REPLACED\)/REPLACEMENT_B/1' < input_file > output_file

答案 1 :(得分:2)

只需运行两次脚本 - 一次用$ {A}替换第一次出现,一次用$ {B}替换(现在第一次)出现。 只替换一次出现:

sed '0,/RE/s//to_that/' file

(从How to use sed to replace only the first occurrence in a file?无耻地被盗)

答案 2 :(得分:1)

这是使用awk的可能解决方案:

#!/usr/bin/awk -f

/TEXT_TO_BE_REPLACED/ {
   if ( n == 0 ) {
      sub( /TEXT_TO_BE_REPLACED/, "REPLACEMENT_TEXT_A", $0 );
      n++;
   }
   else if ( n == 1 ) {
      sub( /TEXT_TO_BE_REPLACED/, "REPLACEMENT_TEXT_B", $0 );
      n++;
   }
}

{
   print
}

答案 3 :(得分:0)

awk 'BEGIN { a[0]="REPLACEMENT_A"; a[1]="REPLACEMENT_B"; } \
  /TEXT_TO_BE_REPLACED/ { gsub( "TEXT_TO_BE_REPLACED", a[i++]); i%=2 }; 1'

答案 4 :(得分:0)

所以,你可以使用sed这样做:

首先,我创建了一个名为test.txt的文件,其中包含:

well here is an example text example
and here is another example text

我选择使用“example”这个词作为要改变的值。

这是命令:cat test.txt | sed -e's /(example)/ test2 / 2'-e's /(example)/ test1 / 1'

提供以下输出:

well here is an test1 text test2
and here is another test1 text

现在sed命令崩溃了:

s - begins search + replace 
/ - start search ended with another /
The parentheses group our text ie example
/test2/ what we are putting in place of example
The number after the slashes is the occurrence we want to replace. 

the -e allows you to run both commands on one command line.

答案 5 :(得分:0)

您也可以使用文本编辑器编辑:

# cf. http://wiki.bash-hackers.org/howto/edit-ed
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s file
   H
   /TEXT_TO_BE_REPLACED/s//REPLACEMENT_TEXT_A/
   /TEXT_TO_BE_REPLACED/s//REPLACEMENT_TEXT_B/
   wq
EOF