我看了这个问题:BASH Palindrome Checker。这就是问题答案从该主题中得出的结论:
grep -E '^[a-z]{3,45}$' /usr/share/dict/words | while read -r word;
do [ $word == `echo $word | rev` ] && echo $word;
done;
我知道这是从“单词”中读取,但在尝试修改它以从文本文件而不是/usr/share/dict/words
中读取时遇到问题。我想让它读取我要求的任何文本文件,所以我可以把:
source palindrome *filename*
这将打印出控制台中文件中找到的回文。后来还有它,所以我可以输出到输出文件:
source palindrome *filename* >> output.txt
我试过这样做,但它不起作用,我真的不确定我要改变它来阅读我的文件:
#!usr/bin/bash
function search
{
filename=$1
grep -E '^[a-z]{3,45}$' "$filename" | while read -r word;
do [ $word == `echo $word | rev` ] && echo $word;
done;
}
search $1
如果给出任何解决方案,它们的格式是否相似?我还没有学到太多其他技术。如果给出更复杂的解决方案,您可以稍微解释一下代码。
输入文件来自电子书,它非常长,所以一个小片段是:(我确实知道这不会在片段中展示回文,但它只是显示它是什么样的文本文件)< / p>
O and that lotion mustn't forget.
Fever near her mouth. Your head it simply. Hair braided over: shell with
seaweed. Why do they hide their ears with seaweed hair?
运行source palindrome filename 时,没有错误消息。我按回车键,终端让我再输入我想要的东西。它看起来不像是在运行脚本
答案 0 :(得分:2)
#!/bin/bash
function search
{
grep -oiE '[a-z]{3,}' "$@" | tr '[:upper:]' '[:lower:]' | while read -r word; do
[[ $word == $(rev <<< "$word") ]] && echo "$word"
done
}
search "$@"
这个原始代码编写的字典在每一行都有一个小写字。要解析每行包含多个混合大小写单词的文本文件,您需要进行一些修改:
^
和$
个锚点,以便在一行的任何位置查找字词。grep -o
打印出匹配的字词。grep -i
匹配大写和小写。tr
将大写字母切换为小写。其他修正:
#!/bin/bash
。它应该是绝对路径,两种首选形式是#!/bin/bash
或#!/usr/bin/env bash
。£word
更改为$word
。"$@"
以便search()
可以接受多个文件名。改进:
{3,}
删除了上限。[[ ]]
为better than single brackets [ ]
。$(cmd)
优于`cmd`
。rev <<< "$word"
优于echo "$word" | rev
。答案 1 :(得分:1)
你的shebang线错了。变化:
#!usr/bin/bash
到
#!/usr/bin/bash
或
#!/bin/bash
答案 2 :(得分:0)
这个(没有脚本):
comm -12 <(nl foo) <(rev foo | nl) | cut -f2