Sed

sed 更改標籤並保留部分內容

  • May 1, 2020

我有一個大文本文件,其中多次出現包含 URL 的標記:

[tag]https://example.com/222389/link/11835457224168404[/tag]

我需要重新格式化標籤,如下所示:

[new-tag]11835457224168404[/new-tag]

(僅擷取“連結”(“id”)之後的部分網址並將標籤修改為“新標籤”:

  • 每行可以有多個標籤;
  • 標籤位置不統一 - 它們在整個文件中的隨機位置中找到;
  • 標籤內容開頭可以有空格(‘http’),使用’http://‘或’https://’,有時使用’www’;
  • 該標籤偶爾會在末尾(在“id”之後)包含內容或空格,如下所示:
[tag]https://example.com/222389/link/11835457224168404/qwertyiop[/tag]

或者

[tag]https://example.com/222389/link/11835457224168404?link=11835457224168401    [/tag]
  • 有時會出現’

$$ tag $$’ 他們自己(沒有關閉$$ /tag $$或’http’)需要被忽略。

我怎樣才能用 sed 或替代品做到這一點?

戰略

雖然可以編寫匹配多字元串的正則表達式,但它們會變得複雜。我們將使用一個技巧將[tag]和轉換[/tag]為單個字元,然後使用否定字元類。在這個腳本中,我將使用 control-a 和 control-b。這些字元不出現在文件中至關重要**。**由於這些很難輸入,我將使用幾個變數s以及e開始和結束標籤。我notend用來表示任何不是結束標籤的字元序列。

#!/bin/bash
s=$'\001' # control-a, for the start tag 
e=$'\002' # control-b, for the end tag
notend="[^$e]*" # expression for not the end tag.
# Program, Change the tags into single characters
# change matched pairs of tags into new form
# convert any unmatched tags back to original form
prog='
s:\[tag]:'"$s"':g
s:\[/tag]:'"$e"':g
s:'"$s$notend"'/link/\([0-9]*\)'"$notend$e"':[new-tag]\1[/newtag]:g
s:'"$s"':[tag]:g
s:'"$e"':[/tag]:g'

# run sed, passing any parameters  
sed -e "$prog" "$@"

用法

保存此腳本,使其可執行,然後執行它,將數據文件作為參數並將輸出重定向到臨時文件。檢查臨時文件。

引用自:https://unix.stackexchange.com/questions/583704