2014-02-27 95 views
0

我有以下批处理SED Linux命令恰好替换线

#! /bin/bash 
PATTERN1="MACRO" 
PATTERN2="HI" 
sed -e "s/${PATTERN1}/${PATTERN2}/g" config.conf 

因此,该文件config.conf的内容是

 
ABC 
    DEF 
    ERF MACRO 
    ERR 
MACRO 

因此,这个命令的输出是:

 
ABC 
    DEF 
    ERF HI 
    ERR 
HI 

但所期望的输出是

 
ABC 
    DEF 
    ERF MACRO 
    ERR 
HI 

换句话说,我只需要用每行完全匹配来替换模式,不要在同一行中包含空格或其他词。

回答

3

添加^$到你想要做确切匹配

你的榜样模式:你可以这样做:

sed -e "s/^${PATTERN1}$/${PATTERN2}/g" ... 

或使用原来的sed线,修改PATTERN1

PATTERN1="^MACRO$" 
+0

答案很糟糕,因为......? – Kent

+0

+1取消downvote –

+1

@FredrikPihl谢谢。我认为答案适用于OP的输入......不理解downvote。希望downvoter可以留下一些提示/评论,以便我可以学习。 – Kent

0

试试这个:

awk '$0==p {$0=r}8' p="${PATTERN1}" r="${PATTERN2}" file 
+1

我会引用shell变量部分。 – Kent

+0

@Kent谢谢,我已经完成了 – Jotne