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

时间:2019-03-29 16:53:00

标签: awk

我正在尝试在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

还可以进行这种翻转吗?

4 个答案:

答案 0 :(得分:3)

要使用任何awk简洁,强大且方便地执行此操作,将是:

const puppeteer = require('puppeteer');

async function run() {

const browser = await puppeteer.launch({headless:true});

  const page = await browser.newPage();
const BUTTON_SELECTOR = 'body > section > section > header > div.reply-button-row > button';      
  await page.goto('https://bozeman.craigslist.org/zip/d/bozeman-panasonic-36-tv/6837588995.html')
await page.waitFor(2000); 

await page.waitFor(BUTTON_SELECTOR);

await page.click(BUTTON_SELECTOR)
//await page.focus(BUTTON_SELECTOR)
//await page.keyboard.press('Enter');
await page.screenshot({ path: 'screenshots/image.png' });  
  browser.close();
}

run();

答案 1 :(得分:2)

您可以尝试遵循(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%s\n",substr($0,1,length($0)-1),val==1+0?2:(val==2?1:val))
   val=""
}'

答案 2 :(得分:1)

那是因为您将$ 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匹配并对其进行音译。您可以在外壳中对tr使用类似的技巧:

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

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

if [[ $string = *[12] ]] ; then
   echo ${string%[12]}$((3-${string: -1}))
else
    echo $string
fi

答案 3 :(得分:1)

awk 'BEGIN{FS=OFS=""}($NF==1||$NF==2){$NF=$NF%2+1}1'

这类似于oguzismail的方法。

  • 仅当最后一个字符为12时更改。
  • 1 % 2 + 1 = 2,而2 % 2 + 1 = 1