使用sed仅在一行的一部分内进行替换

时间:2014-04-02 21:43:22

标签: sed

如何替换'。'在

下面的输入中的'='字符之前的行部分中使用'_'

需要单个sed命令来完成所有三个

echo "few.num.dots=/home/user/.hidden/folder.dot" | sed 's/\./_/g'

必需的输出=> few_num_dots = /家庭/用户/ .hidden / folder.dot

echo "var=nodot" | sed 's/\./_/g'

必需的输出=> VAR =斑点法

echo "var.one=onedot.notthis" | sed 's/\./_/g'

必需的输出=> var_one = onedot.notthis

5 个答案:

答案 0 :(得分:2)

您可以使用t命令使用条件分支。它执行循环,直到替换命令失败,并且该命令替换任何.字符,后跟等号:

echo "few.num.dots=/home/user/.hidden/folder.dot" | 
  sed ':a; s/\.\([^=]*=\)/_\1/; ta'

它产生:

few_num_dots=/home/user/.hidden/folder.dot

答案 1 :(得分:1)

perl的?

echo "few.num.dots=/home/user/.hidden/folder.dot" | 
perl -pe 's/^[^=]+/ ($x=$&) =~ tr{.}{_}; $x /e'
few_num_dots=/home/user/.hidden/folder.dot

AWK?

awk -F= -v OFS='=' '{gsub(/\./,"_",$1)} 1'

答案 2 :(得分:0)

你也可以这样做,

echo "few.num.dots=/home/user/.hidden/folder.dot" |
sed -e '1,/./s/\./_/' -e '1,/./s/\./_/'

few_num_dots=/home/user/.hidden/folder.dot

首先-e替换第一次出现的模式.,然后-e替换下一个... {/ p>

答案 3 :(得分:0)

使用awk

$  echo "few.num.dots=/home/user/.hidden/folder.dot"  |awk '/=/{gsub(/\./,"_",$1)}1' FS="=" OFS="="
few_num_dots=/home/user/.hidden/folder.dot

$ echo "var.one=onedot.notthis" |awk '/=/{gsub(/\./,"_",$1)}1' FS="=" OFS="="
var_one=onedot.notthis

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed 's/=/\n&/;h;y/./_/;G;s/\n.*\n.*\n//' file

插入标记以划分线条,复制线条,翻译字符,附加原始线条并使用标记重新构建线条。