Mac环境下Bash实现单词反转但保持原顺序的技术问询
解决Mac上每行单词单独反转的问题
嘿,我懂你要的效果——让每行里的每个单词各自反转,但单词的原有顺序保持不变对吧?你当前的脚本是直接把整行用rev反转,这会把整个句子的字符顺序都倒过来,自然达不到你想要的结果。下面给你几个在Mac上能正常运行的解决方案:
方法1:用Mac自带的awk(BSD awk)
Mac自带的awk完全可以实现这个需求,核心思路是遍历每行的每个单词,逐个字符反转后替换原单词,最后输出整行:
awk '{ for (i = 1; i <= NF; i++) { len = length($i) reversed = "" for (j = len; j >= 1; j--) { reversed = substr($i, j, 1) reversed } $i = reversed } print }' your_file.txt
把your_file.txt换成你的文件路径就行。这里NF代表当前行的单词数,substr($i, j, 1)用来取出第i个单词的第j个字符,从后往前拼接成反转后的单词。
方法2:用bash结合rev和paste
这种方法更简洁,利用工具链拆分、反转再重组:
input="FILE_PATH" while IFS= read -r line || [[ -n $line ]]; do echo "$line" | tr ' ' '\n' | rev | paste -sd ' ' - done < "$input"
步骤拆解:
tr ' ' '\n':把每行的空格换成换行,让每个单词单独占一行rev:反转每一行(也就是每个单词)paste -sd ' ' -:把所有行用空格连接起来,还原成原来的单词顺序
方法3:用Mac的sed命令
如果你喜欢用sed,可以借助它的命令执行功能来处理每个单词:
sed -E 's/[^[:space:]]+/echo "\0" | rev/ge' your_file.txt
[^[:space:]]+:匹配任意非空格的单词(如果你的单词包含特殊字符,这个正则也能覆盖)e标志:让sed把替换后的内容当作shell命令执行\0:代表匹配到的整个单词,每个单词都会被单独传给rev反转
补充:你原有脚本的问题
你原来的代码echo $line | rev是把整行的所有字符反转,比如输入"Test this word"会变成"drow sihT tseT",这和你要的“每个单词单独反转”完全不同,所以才达不到预期效果。
内容的提问来源于stack exchange,提问作者S Allexandriya
相关产品推荐
相关产品推荐

