在发布之前,我已经浏览了 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!
我尝试使用 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##*[^.\!?]}
- 删除句子中直到 的所有字符。 ! ?