使用grep等bash工具解决难题

5 regex linux bash shell grep

我需要使用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
Run Code Online (Sandbox Code Playgroud)

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

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

fed*_*qui 18

我正在覆盖水平和垂直匹配.主要思想是删除空格,然后使用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
Run Code Online (Sandbox Code Playgroud)

垂直匹配

为此,我们首先必须转置文件的内容.为此,我使用我用于另一个答案的方法:

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)
              }
        }'
}
Run Code Online (Sandbox Code Playgroud)

让我们看看:

$ 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
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用rev(如您在问题中所建议的)镜像词.也tac可用于垂直镜像话有意思.

对角线匹配

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

e x x x x
x g x x x
x x g x x
Run Code Online (Sandbox Code Playgroud)

可以变成

e x x x x
g x x x
g x x
Run Code Online (Sandbox Code Playgroud)

你可以使用垂直/水平方法.

为此,您可以printf按照使用printf格式的变量中的描述使用:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 老兄,我爱你.你有贝宝?我想给你买啤酒. (10认同)
  • 这里绝对偏离主题,但男人!你有很棒的口味!La Chouffe也是我最喜欢的啤酒之一! (3认同)
  • 哈哈,欢迎你.是的,我会要求La Chouffe:DI添加了一些关于如何对角匹配的解释. (2认同)
  • PM我的Paypal,我会给你一个La Chouffe的钱! (2认同)