Замените четные слова соответствующими числами "*" - PullRequest
3 голосов
/ 03 ноября 2019

Мне нужно ввести некоторое количество строк, заменить все слова в четных точках строк на соответствующее число «*» и вывести результат на экран.

Например, ввод:

Hi! How are you? 

It's been a while since we've met.

даст нам:

Hi! *** are ****

It's **** a ***** since ***** met.

Вот что я попробовал:

#!/bin/bash

res=""

mm="*"

i=0

while IFS= read -r line; do 

for word in line

do

tmp=""

lng=${#word}

if [ $(($lng % 2)) -eq 0 ]; 

then

while [ $i -lt $lng ]; do

tmp=$tmp$mm

let i=i+1

done

res+=${tmp}

else

res+=${word}

fi

done

done

echo -e "${res}"

Но он не делает то, что должен (

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

В качестве однострочного perl:

$ echo "Hi! How are you?\nIt's been a while since we've met." \
   | perl -pe 's/\S+\s+\K(\S+)/"*" x length($1)/eg'
Hi! *** are ****
It's **** a ***** since ***** met.

По существу, для каждой пары слов, разделенных пробелами, замените второе на число звездочек, равное его длине.

1 голос
/ 03 ноября 2019

Не могли бы вы попробовать следующее. Введите в слова BEGIN функции *1001* все слова, которые вы хотите заменить на *.

awk 'BEGIN{  
   num=split("hi,hello,bla",arr,",")
   for(i=1;i<=num;i++){
     array[arr[i]]
   }
}
{
  for(j=1;j<=NF;j++){
    val=length($j)
    if($j in array){ 
      $j=sprintf("%0"val"d","")
      gsub(/0/,"*",$j)
    }
  }
}
1
' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...