Linux bash awk 打印带有特殊字母的单词

Linux bash awk 打印带有特殊字母的单词

我有一个网址:

www.google.com/word/word1/word_2/word3/word4

我想使用 awk 只打印包含_特殊字符的单词。有时文件夹层次结构可能会发生变化:

www.google.com/word/word1/word2/word3/word_4

我正在使用这个,但有时文件夹位于上面$6

folder=$(echo "$url" | awk -F/ '{print $6}')

我需要在/字符之间打印文件夹名称。

答案1

像这样的东西有效......可能有更有效的方法:

echo 'www.google.com/word/word1/word2/word3/word_4' | awk -F'/' '{for(i=2;i<=NF;i++){if($i~/_/){print $i}}}'
word_4

我们只是迭代所有字段并检查该单词是否包含下划线;如果是,请打印该单词。从 2 开始,假设域名不变。

非迭代方法的想法:

$ echo 'www.google.com/word/word1/word_2/word3/word4' | awk '{print gensub(/^.*\/([^/]+_[^/]*).*/,"\\1","1")}'
word_2

如果不需要 awk - 这里有一个更优雅的解决方案:

$ echo 'www.google.com/word/word1/word_2/word3/word4' | grep -oE '[^/]+_[^/]*'
word_2

答案2

一个简单的解决方案就是:

% echo 'www.google.com/word/word1/word_2/word3/word4' | tr -s '/' '\n'  |grep _
word_2

也就是说,将斜杠更改为换行符,然后打印包含下划线的结果行。

如果除斜杠之外的其他内容也应被视为单词分隔符,请将它们包含在第一个带引号的字符串中。或者反过来做,列出任何可以成为单词一部分的内容:

% echo 'www.google.com/word/word1/word_2/word3/word4' | tr -sc 'a-zA-Z_0-9' '\n'  |grep _
word_2

答案3

如果使用zsh代替bash,您可以提取/包含_with 的分隔单词:

words=( ${(M)${(s[/])url}:#*_*} )

无论这些字可能包含什么字节值,这都可以工作,并且不涉及分叉进程或运行外部实用程序。

${(s[/])url} s将变量拆分为/.扩展到数组中匹配该模式${(M)array:#pattern}的元素。M

我也可以在 中完成bash,但是比较麻烦:

words=()
IFS=/; set -o noglob
for word in $url; do
  if [[ $word = *_* ]]; then
    words+=( "$word" )
  done
done

awkperl如果您有一长串 URL,每行一个来自某个文本流/文件,那么/会更合适。

perl

that-stream | perl -F/ -lae 'print for grep /_/, @F'

相关内容