linux Bash sed -查找字符串中的hashtags

ekqde3dh  于 2023-08-03  发布在  Linux
关注(0)|答案(4)|浏览(113)

基于this post,我尝试使用一个命令来查找一个非常复杂的字符串中的所有hashtag单词(以#开头的单词):

echo "Le #cerveau d’#Einstein n’est « #Ordre des #Mopses\" » pas" | sed -e 's/^/ /g' -e 's/ [^#][^ ]*//g' -e 's/^ *//g'

字符串
遗憾的是,输出结果为:

#cerveau #Mopses"


而不是:

#cerveau #Einstein #Ordre #Mopses


正确的命令应该是什么?

8ljdwjyq

8ljdwjyq1#

grep通常更擅长提取子字符串。使用GNU-grep的-o选项(只输出匹配的部分),您可以

echo "Le #cerveau d’#Einstein n’est « #Ordre des #Mopses\" » pas" \
| grep -o '#[[:alpha:]]*'

字符串
如果你真的需要sed,做类似的事情:将所有不以#开头的单词替换为空格,然后删除第一个单词并压缩空格:

sed -e 's/[^[:alpha:]#][[:alpha:]]*/ /g' \
    -e 's/^[^#]*//' \
    -e 's/  */ /g'

xmq68pz9

xmq68pz92#

如果你想使用sed,你可以分离出所有以\n开头的单词,然后找到它们:

echo "Le #cerveau d’#Einstein n’est « #Ordre des #Mopses\" » pas" \
| sed -re 's/(#\w+)/\n\1\n/g' \
| sed -rn '/^(#\w+)$/p'

字符串
您需要在sed中使用-r选项来使用扩展正则表达式。

dgtucam1

dgtucam13#

你可以这样做:

echo "Le #cerveau d’#Einstein n’est « #Ordre des #Mopses\" » pas" | grep -o '#[a-zA-Z0-9_]\+'

字符串
您将得到预期的输出:

#cerveau
#Einstein
#Ordre
#Mopses


说明:grep中的-o选项:
仅打印行的匹配部分。
因此,上面的grep命令匹配一个hashtag,后跟非零数量的字母、数字和下划线。

dvtswwa3

dvtswwa34#

再用一个命令(替换)和没有正则表达式扩展来踢一下jar:

echo "Le #cerveau d’#Einstein n’est « #Ordre des #Mopses\" » pas"   \
| sed -e 's/[^#]*\(#[[:alpha:]]*\)[^#]*/\1 /g'

字符串
提取以#开头的单词并删除所有其他字符串。
提取依赖于sed的贪婪*计算。
产出:

#cerveau #Einstein #Ordre #Mopses


测试环境:

linuxuser@ubuntu:~$ uname -a
Linux ubuntu 4.15.0-74-generic #84-Ubuntu SMP Thu Dec 19 08:06:00 UTC 2019 i686 i686 i686 GNU/Linux
linuxuser@ubuntu:~$ sed --version
sed (GNU sed) 4.4
Copyright (C) 2017 Free Software Foundation, Inc.


除此之外,请考虑:

echo "# Le #cerveau d’#Einstein n’est « #Ordre des #Mopses\" » pas"  \
| sed   -e 's/[^#]*\(#[[:alpha:]]*\)[^#]*/\1 /g'

# #cerveau #Einstein #Ordre #Mopses

相关问题