反转单词,但保持命令Bash

时间:2018-05-22 01:03:44

标签: bash macos shell terminal

我有一个带行的文件。我想颠倒这些词,但保持它们的顺序相同。 例如:"测试这个词" 结果:" tseT siht drow"

我使用MAC,所以awk似乎无法工作。 我现在得到了什么

input=FILE_PATH
while IFS= read -r line || [[ -n $line ]]
do
    echo $line | rev
done < "$input"

5 个答案:

答案 0 :(得分:3)

这是一个完全避免awk的解决方案

#!/bin/bash

input=./data
while read -r line ; do
    for word in  $line ; do
        output=`echo $word | rev`
        printf "%s " $output
    done
    printf "\n"
done < "$input"

答案 1 :(得分:2)

如果xargs适用于mac:

echo "Test this word"  | xargs -n 1 | rev | xargs

答案 2 :(得分:0)

使用rev和awk

将此视为示例输入文件:

$ cat file
Test this word
Keep the order

尝试:

$ rev <file | awk '{for (i=NF; i>=2; i--) printf "%s%s",$i,OFS; print $1}'
tseT siht drow
peeK eht redro

(这使用awk但是,因为它不使用高级awk功能,所以它应该适用于MacOS。)

在脚本中使用

如果您需要将上述内容放在脚本中,请创建如下文件:

$ cat script
#!/bin/bash
input="/Users/Anastasiia/Desktop/Tasks/test.txt"
rev <"$input" | awk '{for (i=NF; i>=2; i--) printf "%s%s",$i,OFS; print $1}'

然后,运行文件:

$ bash script
tseT siht drow
peeK eht redro

使用bash

while read -a arr
do
   x=" "
   for ((i=0; i<${#arr}; i++))
   do
      ((i == ${#arr}-1)) && x=$'\n'
      printf "%s%s" $(rev <<<"${arr[i]}") "$x"
   done
done <file

将上述内容应用于我们的同一测试文件:

$ while read -a arr; do x=" "; for ((i=0; i<${#arr}; i++)); do ((i == ${#arr}-1)) && x=$'\n'; printf "%s%s" $(rev <<<"${arr[i]}") "$x"; done; done <file
tseT siht drow 
peeK eht redro 

答案 3 :(得分:0)

在您的阅读循环中,您可以迭代字符串中的单词并将其传递给rev

line="Test this word"
for word in "$line"; do
    echo -n " $word" | rev
done
echo  # Add final newline

<强>输出

tseT siht drow

答案 4 :(得分:0)

你实际上与bash相当好。您可以使用字符串索引字符串长度和C样式for循环来遍历每个单词中的字符,从而构建一个反向字符串以输出。您可以通过多种方式控制格式以处理单词之间的空格,但简单的标志first=1与其他任何内容一样简单。您可以通过阅读

执行以下操作
#!/bin/bash

while read -r line || [[ -n $line ]]; do        ## read line
    first=1                                     ## flag to control space
    a=( $( echo $line ) )                       ## put line in array
    for i in "${a[@]}"; do                      ## for each word
        tmp=                                    ## clear temp
        len=${#i}                               ## get length
        for ((j = 0; j < len; j++)); do         ## loop length times
            tmp="${tmp}${i:$((len-j-1)):1}"     ## add char len - j to tmp
        done
        if [ "$first" -eq '1' ]; then           ## if first word
            printf "$tmp"; first=0;             ## output w/o space
        else
            printf " $tmp"                      ## output w/space
        fi
    done
    echo ""     ## output newline
done

示例输入

$ cat dat/lines2rev.txt
my dog has fleas
the cat has none

示例使用/输出

$ bash revlines.sh <dat/lines2rev.txt
ym god sah saelf
eht tac sah enon

仔细看看,如果您有疑问,请告诉我。