Sed
sed 更改標籤並保留部分內容
我有一個大文本文件,其中多次出現包含 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" "$@"
用法
保存此腳本,使其可執行,然後執行它,將數據文件作為參數並將輸出重定向到臨時文件。檢查臨時文件。