如何翻转字符串的最后一个字符



我正在尝试在 1 和 2 之间翻转字符串的最后一个字符。我需要了解为什么system2能够转换为system1,但是system1不能转换为system2

echo system2|awk -vFS="" '{if($NF==1) {gsub($NF,2) };if($NF==2)gsub($NF,1)}1'
system1
echo system1|awk -vFS="" '{if($NF==1) {gsub($NF,2) };if($NF==2)gsub($NF,1)}1'
system1

另外,有没有更聪明的方法来做这个翻转?

要简洁

、健壮和便携地使用任何 awk 执行此操作,将是:

$ echo system2| awk '!sub(/1$/,2){sub(/2$/,1)}1'
system1
$ echo system1| awk '!sub(/1$/,2){sub(/2$/,1)}1'
system2

您可以尝试以下(OP 的尝试更正(。

echo system1|awk -vFS="" '{if($NF==1){gsub($NF,2);print;next};if($NF==2)gsub($NF,1)}1'

为什么OP的尝试不起作用:

由于第一个条件为 TRUE,$NF 1因此它将其更改为2现在第二个条件为 TRUE,并且2再次替换为 1因此它给出了相同的输出。

我解决这个问题的尝试是:由于OP尝试的代码非常特定于GNU awk,所以我们可以尝试遵循哪个可能是更通用的解决方案。

echo system1 | 
awk '
{
   val=substr($0,length($0))
   printf("%s%sn",substr($0,1,length($0)-1),val==1+0?2:(val==2?1:val))
   val=""
}'

这是因为您将$NF更改为 2,这使得第二个条件为真,并且它再次更改回 1。你需要一个else.

awk -vFS="" '{if($NF==1) {gsub($NF,2) }else if($NF==2)gsub($NF,1)}1'

我可以在 sed 中想到一个更简单的解决方案:

sed 's/1$/2/;t;s/2$/1/'

它使用 t 命令(如果未指定标签(,如果之前的替换成功,则该命令(如果未指定标签(将转到脚本的末尾。

另一种可能的解决方案是使用 Perl:

perl -pe 's/([12])$/ $1 =~ tr=12=21=r /e'

它匹配最后的 1 或 2 并对其运行音译。您可以在 shell 中使用类似的技巧tr

printf '%s' ${string:0:-1}
printf '%sn' ${string: -1} | tr 12 21

无需掏空,您可以使用例如参数扩展和算术:

if [[ $string = *[12] ]] ; then
   echo ${string%[12]}$((3-${string: -1}))
else
    echo $string
fi
awk 'BEGIN{FS=OFS=""}($NF==1||$NF==2){$NF=$NF%2+1}1'

这类似于oguzismail的方法。

  • 仅当最后一个字符12时才更改。
  • 1 % 2 + 1 = 22 % 2 + 1 = 1

最新更新