Bash 保留标点符号字符位置的字符串中的反向单词

问题描述 投票:0回答:1

在发布之前,我已经浏览了 stackoverflow 向导中的几乎所有建议,但大多数建议都不是针对 c# 中的 bash 的。 该练习是针对c语言的。

问题。

编写一个程序来颠倒句子中的单词:

Enter a sentence: you can cage a swallow can't you?
Reversal of sentence: you can't swallow a cage can you?

使用循环将字符一一读取,存入一维char数组中。让循环在句点、问号或感叹号(“终止字符”)处停止,这些字符保存在单独的 char 变量中。然后使用第二个循环在数组中向后搜索最后一个单词的开头。打印最后一个单词,然后向后搜索倒数第二个单词。重复直到到达数组的开头。最后,打印终止符。

我尝试使用 tac 和 tr 来交换空格和换行符,以便 tac 读取,但这对我不起作用。最终用while循环解决了。想知道是否有更短的方法来实现相同的事情,但不需要 awk 或 sed。

我的代码:

#!/bin/bash
#set -x

read -rp "Enter a sentence: " -a sentence

if [ -z "$sentence" ]; then
echo "empty..exiting"
exit 1
fi

terminator=""

i=$((${#sentence[@]}-1))
while [ "$i" -ge 0 ]; do
   b=0
   while [ "$b" -lt "${#sentence[$i]}" ]; do
   if [ "${sentence[$i]:$b:1}" == "?" ] || \
   [ "${sentence[$i]:$b:1}" == "!" ] || \
   [ "${sentence[$i]:$b:1}" == "." ]; then
   terminator="${sentence[$i]:$b:1}"
   sentence["$i"]=$(tr -d [:punct:] <<<"${sentence[$i]}")
   break
   fi
   ((b++))
   done
echo -n "$(tr [A-Z] [a-z] <<<${sentence[$i]})"
if [ "$i" -gt 0 ]; then
echo -n " "
fi
((i--))
done

if [ -n "$terminator" ]; then
echo "$terminator"
else
echo
fi

exit 0


输入:

Enter a sentence: Every living thing is a masterpiece, written by nature and edited by evolution!

输出:

evolution by edited and nature by written masterpiece, a is thing living every!

arrays string bash reverse delimiter
1个回答
0
投票

我尝试使用 tac 和 tr 来交换空格和换行符以供 tac 读取,但这对我不起作用

$ sentence="you can cage a swallow can't you?"
$ echo "$(<<<${sentence%%[.\!?]} tr ' ' '\n' | tac | paste -sd' ')${sentence##*[^.\!?]}"
you can't swallow a cage can you?
  • $(...)
    命令替换
  • <<<
    这里是字符串
  • ${sentence##[.\!?]}
    - 删除。 !或者 ?从字符串末尾开始
  • tr ' ' '\n'
    - 用换行符替换空格
  • tac
    - 请参阅
    tac --help
  • paste -sd ' '
    - 用空格连接行
  • ${sentence##*[^.\!?]}
    - 删除句子中直到 的所有字符。 ! ?
© www.soinside.com 2019 - 2024. All rights reserved.