我有一个网址:
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
awk
perl
如果您有一长串 URL,每行一个来自某个文本流/文件,那么/会更合适。
和perl
:
that-stream | perl -F/ -lae 'print for grep /_/, @F'