假设我有一个像这样的文本文件: Called it hello
1. https://www.google.ca/
2. https://www.bob.ca/
3. https://www.cat.ca/
如果给出参考号,我将如何 grep 链接?
$ grep hello '1.' # (what should be here to just get the link?)
例如我希望输出:https://www.google.ca/仅有的
答案1
仅使用 grep 命令:
grep --perl-regexp --only-matching '(?<=^1\. ).*' hello
一些解释:
- --perl-regexp 激活 Perl 风格的正则表达式
- --only-matching 只显示匹配的部分
- (?<=^1\. ) 表示:前面是以 '1 开头的行。 ' ('^' = '行开始' 限制)
正如建议的用户1404316,常量 '1' 可以用变量替换:
IDX=1
grep --perl-regexp --only-matching "(?<=^${IDX}\. ).*" hello
答案2
在模式(数字)上使用 sed 来选择行并仅保留您想要的部分:URL
-bash-4.4$ cat > toto
1. https://www.google.ca/
2. https://www.bob.ca/
3. https://www.cat.ca/
-bash-4.4$ sed '/2/ !d ; s/.*\ //' toto
https://www.bob.ca/
-bash-4.4$
答案3
法线grep
本身只给你匹配的线。从中删除无用的部分是另一步。
首先,您可能想要一个更像 的模式^1\.
。插入符号强制匹配行的开头,反斜杠使点仅匹配文字点,而不是“任何字符”,这是未转义点的特殊含义。如果没有这些,模式将匹配1
作为 URL 一部分的 a 或12
行开头的数字等。
然后,您需要删除行开头的数字。sed
在这里很有用。sed
将删除任意数量的数字,加上一个点,以及行首的一个空格。所以我们可以这样写:
$ grep -e '^1\.' urls | sed 's/^[0-9]*\. //'
但是sed
的替换命令也可以作为一个条件,这会尝试将给定的数字替换为空,并在替换完成后打印结果行:
$ sed -ne 's/^1\. //p' urls
(-n
意味着不打印所有行,这是默认行为。)
答案4
使用 awk 更简单:
$ awk '"2."==$1{print $2}' hello
https://www.bob.ca/
使用您选择的任何数字而不是2.
选择其他行。