如何从字符串中替换最后一个字符(它是}
)?我需要在最后一个字符之前的所有内容,但用一些新字符串替换最后一个字符。
我用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 :(得分: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
}'