linux - 在文件中查找以字符开头的单词并添加/添加文本

标签 linux bash sed

我正在尝试编写一个日志scraper,它将添加文本链接,

例如日志包含 -

This is some text TK-12354 aasdgf asdf 
adsf aasdf TK-122 sadf sfdg   sfdgsdfg
dghgf sfdg sdfg  sdfg sdgf dsf TK-1243

我想通过添加将所有“TK-”单词变成链接

<a href="https://website/browse/TK-######/">TK-######</a>

所以上面的文字看起来像这样 -

This is some text <a href="https://website/browse/TK-12354/">TK-12354</a> aasdgf asdf 
adsf aasdf <a href="https://website/browse/TK-122/">TK-122</a> sadf sfdg   sfdgsdfg
dghgf sfdg sdfg  sdfg sdgf dsf <a href="https://website/browse/TK-1243/">TK-1243</a>

我想出了一种在 bash 中执行此操作的方法,但它确实很笨重,并且需要很长时间才能运行该文件 -

IFS=$'\n'
declare -a COMMENTS=($(cat /usr/local/statusTEST.dat | grep -n "TK-"))

for COMMENT in "${COMMENTS[@]}"
    do
        LINE=`echo $COMMENT | cut -d : -f 1`
        TICKET=`echo $COMMENT | grep -o '\bTK-\w*'`
        
        sed -i "${LINE}s/$TICKET/\<a href\=\"https\:\/\/website.com\/browse\/$TICKET\"\>$TICKET\<\/a\>/g" "/usr/local/statusTEST.dat"

    done

我尝试使用 sed 来读取和更改整个文件,但我无法完全掌握将引用添加到 url 中的语法,甚至无法将其附加到末尾,即

sed -i "s/\bTK-/\<a href\=\"https\:\/\/website.com\/browse\/g"

有人有什么想法吗?

最佳答案

您可以使用单个 sed 命令,如下所示:

sed 's~TK-[0-9]*~<a href="https://website/browse/&/">&</a>~g' file

This is some text <a href="https://website/browse/TK-12354/">TK-12354</a> aasdgf asdf
adsf aasdf <a href="https://website/browse/TK-122/">TK-122</a> sadf sfdg   sfdgsdfg
dghgf sfdg sdfg  sdfg sdgf dsf <a href="https://website/browse/TK-1243/">TK-1243</a>
  • &sed 中完全匹配的反向引用
  • 我在 sed 中使用 ~ 作为正则表达式分隔符,以避免在替换文本中过度转义 /

根据下面的评论:

if I wanted to ignore entries that had already been done

您可以将此 sed 与 2 个匹配 TK 字符串的捕获组一起使用,前提是它前面有空格:

sed -E 's~(^|[[:blank:]])(TK-[0-9]+)~\1<a href="https://website/browse/\2/">\2</a>~g' file

关于linux - 在文件中查找以字符开头的单词并添加/添加文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50115463/

相关文章:

python - 有没有办法用python将 '\r'写入linux上的文件?

python - Linux服务器列出可以登录的用户

regex - awk 模式匹配

regex - Sed 用另一个字符的多次重复替换一个字符的多次重复

loops - awk 拆分更多列并打印第一个单词

linux - 当我在 Linux 中的项目目录上运行 make 命令时,出现以下错误

linux - LXC容器显示主节点磁盘空间

linux - 不能在 awk 命令中使用 unix $variable

bash - 如何在 Bash 中获取带有标志的参数

shell - sed:参数列表太长