替换字符串中的最后一个字符

时间:2017-01-02 02:53:33

标签: bash macos

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

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

例如:

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

应该成为:

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

这取代了最后一次出现:

}

\\cf2 Its red now
}

5 个答案:

答案 0 :(得分: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 :(得分:1)

替换尾随}可以这样做(PS {0}提示为$,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}会从tail的末尾删除字符串$str;我记得%以't'结束尾部(类似${str#head}的哈希以'h'开头)。

有关其余详细信息,请参阅Bash手册中的shell parameter expansion

如果您不知道最后一个字符,可以使用?元字符来匹配结尾:

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

答案 2 :(得分: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

答案 3 :(得分: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=})中的字符

答案 4 :(得分:0)

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

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