使用 sed (?) 提取在原始字符串中重复的字符串的一个实例

使用 sed (?) 提取在原始字符串中重复的字符串的一个实例

输入:

<a href=FII/FOO./>FOO</a>

输出:

FOO

问:如何用输出替换输入? FII 和“./>”是常量。 FOO 可以变化为任何英文字母以及“-”和“.”。

更新:(澄清“FOO”)

FOO=ASD
then: 
<a href=FII/ASD./>ASD</a>

FOO=XYZ
<a href=FII/XYZ./>XYZ</a>

UPDATE2:(这个不起作用:O)

[user@notebook ~] echo '<a href=FII/FOO./>FOO</a>'
<a href=FII/FOO./>FOO</a>
[user@notebook ~] echo '<a href=FII/FOO./>FOO</a>' | sed 's/>[ \t]*\([^ \t]\+\)[ \t]*</\1/'
<a href=FII/FOO./FOO/a>
[user@notebook ~] 

答案1

如果您想要链接名称:

sed 's@^<a href[^>]*>\([^<]*\)</a>$@\1@'

答案2

如果您想做的就是丢弃href=FII/...之外的所有内容./,我会推荐类似以下内容的内容(使用|sed 分隔符):

sed -e 's|^.*href=FII/\([A-Za-z.-]*\)\./>.*$|\1|'

例子:

$ echo "<a href=FII/ASD./>ASD</a>"|sed 's|^.*href=FII/\([A-Za-z.-]*\)\./>.*$|\1|'
ASD
$ echo "<a href=FII/XYZ./>XYZ</a>"|sed 's|^.*href=FII/\([A-Za-z.-]*\)\./>.*$|\1|'
XYZ
$ echo "<a href=FII/morgel.dorgel./>XYZ</a>"|sed 's|^.*href=FII/\([A-Za-z.-]*\)\./>.*$|\1|'
morgel.dorgel

答案3

如果您可以保证每行有一个(格式良好的)标签,您可以这样做:

sed 's/^.*>[ \t]*\([^ \t]\+\)[ \t]*<.*$/\1/' your_file

这不会检查FOO您的示例中是否重复。要仅替换那些FOO在开始标记分隔符和标记正文中重复的实例,您可以使用以下命令:

sed 's@< *a *href *= *FII/\([-a-zA-Z.]\+\) *\./\?> *\1 *< */ *a *>@\1@' your_file

Perl 中也是如此,以获得更好的可读性:

perl -pe 's{
            < \s* a \s* href \s* = \s* FII/  # Constant part
               ([-a-zA-Z.]+)                 # Payload (saved in $1)
               \s*\./?\s*>                   # Optional space, ./ and >
               \s*\1\s*                      # Payload repeated
            <\s*/\s*a\s*>                    # Closing delimiter
           }{$1}x                            # Replace match with $1
' your_file

相关内容