2017-01-02 206 views
1

如何从字符串中替换最后一个字符(它是})?我需要最后一个字符前的所有内容,但用一些新字符串替换最后一个字符。替换字符串中的最后一个字符

我用awk和sed尝试了很多东西,但没有成功。

例如:

...\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural 
\\f0 
}' 

应该变成:

...\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural 
\\f0 
\\cf2 Its red now 
}' 

这将替换最后一次出现:

} 

\\cf2 Its red now 
} 
+0

不是一个确切的重复,但非常接近:我如何可以替换在bash另一个字符的字符串的最后一个字符?(http://stackoverflow.com/q/19169175/3266847) –

回答

1

的sed这样做:

# replace '}' in the end 
echo '\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural \f0 }' | sed 's/}$/\\cf2 Its red now}/' 

# replace any last character 
echo '\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural \f0 }' | sed 's/\(.\)$/\\cf2 Its red now\1/' 
1

更换后}可以这样做(与$为PS1提示和>为PS2提示符):

$ str="...\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural 
> \\f0 
> }" 
$ echo "$str" 
...\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural 
\f0 
} 
$ echo "${str%\}}\cf2 It's red now 
}" 
...\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural 
\f0 
\cf2 It's red now 
} 
$ 

第3行将您的字符串分配给我的变量str。接下来的4行显示了字符串中的内容。 2行:

echo "${str%\}}\cf2 It's red now 
}" 

包含您请求的材料(文法校正)替换,最后一行回显替代值。

基本上,${str%tail}$str的末尾删除字符串tail;我记得%以't'结尾(类似的${str#head}具有以'h'开头的散列值)。

请参阅Bash手册中的shell parameter expansion了解其余详细信息。

如果你不知道的最后一个字符,你可以使用一个?元字符结尾,而不是匹配:

echo "${str%?}and the extra" 
0

首先请用换行

str=$(printf "%s\n%s\n%s" '\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural' '\\f0' "}'") 

你看看现在的字符串最后}在您的字符串中,并将其替换为换行符。
$确保它只会在最后一行代替它,&代表匹配字符串。

echo "${str}" |sed '$ s/}[^}]$/\\\\cf2 Its red now\n&/' 

上述解决方案仅适用于}位于最后一行时。它变得更加困难,当你也想支持str2

str2=$(printf "Extra } here.\n%s\nsome other text" "${str}") 

你不能在最后一行匹配}。删除最后一行的地址$将导致替换所有}字符(我在str2的开头添加了})。你只想替换最后一个。
更换一次是以..../1强制执行。通过使用tac颠倒行的顺序来完成最后而不是第一个。由于替换后您将再次使用tac,因此您需要在sed替换字符串中使用不同的顺序。

echo "${str2}" | tac |sed 's/}[^}]$/&\n\\\\cf2 Its red now/1' |tac 
0

在awk中:

$ awk ' BEGIN { RS=OFS=FS="" } $NF="\\\\cf2 Its red now\n}"' file 
  • RS=""RS到一个空的记录(将其更改为满足您的需求)
  • OFS=FS=""分离字符的每个到它自己的领域
  • $NF="\\\\cf2 Its red now\n}"内容替换最后一个字段中的字符($NF=})与引用文字
+0

您的命令给我2个大括号: ... \\ \\ tx4535 \\ tx5102 \\ tx5669 \\ tx6236 \\ tx6803 pardirnatural \\ F0 } \\ CF2它的红色现在 } \t #Please纠正。 –

+0

@ClaesWikner它替换字符串_it的一个'}'_中的最后一个字符。如果它不是最后一个,那么最后的任何内容都会被替换,并且原来的'}'保持在那里。 –

0
awk '{sub(/\\f0/,"\\f0\n\\\\\cfs Its red now")}1' file 

...\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural 
\\f0 
\\cfs Its red now 
}' 
相关问题