我正在寻找一种方法,用$ {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
...
答案 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