【问题标题】:Solve a puzzle using bash tools such as grep使用 bash 工具(例如 grep)解决难题
【发布时间】:2014-12-18 01:15:26
【问题描述】:

我需要使用 shell 脚本解决一个难题。我尝试将 greprev 结合起来,并将输出保存到一个临时文本文件中,但仍然不知道如何完全解决它。

这就是要解决的难题:

j s e t f l
a l s f e l
g a a n p l
e p f d p k
r e g e l a
f n e t e n

包含要使用的单词表的文件位于http://pastebin.com/DP4mFZAr

我知道如何告诉 grep 在哪里找到要匹配的模式,作为使用 $ grep -Ff wordlist puzzle 从文本文件中提取的固定字符串和 如何使用 $ rev puzzle | grep -Ff wordlist puzzle 搜索镜像词,从而处理水平线,但我如何处理垂直词呢?

【问题讨论】:

  • 快速评论:grep 不是“Bash 工具”。
  • 既然你有了答案,这是作业吗?

标签: regex linux bash shell grep


【解决方案1】:

我正在介绍水平和垂直匹配。主要思想是删除空格,然后将grep -f 与给定的单词列表一起使用,存储在words 文件中。

使用grep -f,结果显示在行内。如果您只想查看匹配的测试,请使用grep -of

横向匹配

$ cat puzzle | tr -d ' ' | grep -f words
alsfel
gaanpl
regela
fneten

$ cat puzzle | tr -d ' ' | grep -of words
als
gaan
regel
eten

垂直匹配

为此,我们首先要转置文件的内容。为此,我使用我用于another answer of mine 的内容:

transpose () {
  awk '{for (i=1; i<=NF; i++) a[i,NR]=$i; max=(max<NF?NF:max)}
        END {for (i=1; i<=max; i++)
              {for (j=1; j<=NR; j++) 
                  printf "%s%s", a[i,j], (j<NR?OFS:ORS)
              }
        }'
}

让我们看看:

$ cat puzzle | transpose | tr -d ' ' | grep -f words
jagerf
slapen
esafge
tfndet
lllkan

$ cat puzzle | transpose | tr -d ' ' | grep -of words
jager
slapen
af
ge
de
kan

然后您可以使用rev(正如您在问题中建议的那样)作为镜像词。 tac 对于垂直镜像的单词也很有趣。

对角线匹配

对于对角线匹配,我认为一种有趣的方法是将每一行向左/向右移动一点。这样,

e x x x x
x g x x x
x x g x x

可以变成

e x x x x
g x x x
g x x

您可以使用垂直/水平方法。

为此,您可以使用printf,如Using variables in printf format 中所述:

$ cat a
e x x x x
x g x x x
x x g x x
$ awk -v c=20 '{printf "%*s\n", c, $0; c-=2}' a
        e x x x x
        x g x x x
    x x g x x

【讨论】:

  • 老兄,我爱你。你有贝宝?我想给你买杯啤酒。
  • 哈哈,不客气。是的,我会要求一个 La Chouffe :D 我添加了一些关于如何对角匹配的解释。
  • 把你的 Paypal 发给我,我会给你钱买 La Chouffe!
  • 这里绝对是题外话,但是伙计!你很有品味! La Chouffe 也是我最喜欢的啤酒之一!
  • 你们应该试试'Kasteel Cuvée du Château'。它非常棒(也不适合胆小的人——它的 11.6%)。
猜你喜欢
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2023-02-02
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
相关资源
最近更新 更多