[英]bash Script to replace words
希望在服務器上運行腳本以查看文件的路徑並替換單詞,而在div中匹配。
所以需要將_toself替換為作者等於某個電子郵件test@example.com的觀眾
URL = / var / www / sever / temp / fhyw1 FILE = user.txt
<div class='entry'>
<div class='pageurl'>temp/fhyw1</div>
<div class='context'>text</div>
<div class='subject'>testing</div>
<div class='notetext'></div>
<div class='signed'>USER</div>
<div class='author'>test@example.com</div>
<div class='color'>0</div>
<div class='visibility'>shared</div>
<div class='to'>_toself</div>
<div class='num'>4</div>
</div>
<div class='entry'>
<div class='pageurl'>temp/fhyw1</div>
<div class='context'>text</div>
<div class='subject'>testing</div>
<div class='notetext'></div>
<div class='signed'>USER</div>
<div class='author'>user@example.com</div>
<div class='color'>0</div>
<div class='visibility'>shared</div>
<div class='to'>_viewers</div>
<div class='num'>4</div>
</div>
我們有一些文字
$> cat ./text
<div class='entry'>
<div class='pageurl'>temp/fhyw1</div>
<div class='context'>text</div>
<div class='subject'>testing</div>
<div class='notetext'></div>
<div class='signed'>USER</div>
<div class='author'>test@example.com</div>
<div class='color'>0</div>
<div class='visibility'>shared</div>
<div class='to'>_toself</div>
<div class='num'>4</div>
</div>
<div class='entry'>
<div class='pageurl'>temp/fhyw1</div>
<div class='context'>text</div>
<div class='subject'>testing</div>
<div class='notetext'></div>
<div class='signed'>USER</div>
<div class='author'>user@example.com</div>
<div class='color'>0</div>
<div class='visibility'>shared</div>
<div class='to'>_viewers</div>
<div class='num'>4</div>
</div>
我們需要將_toself
'替換為'值與viewers
,但僅限於div,其中'author'等於test@example.com
我認為sed可以幫助你,但你應該有一些經驗,用sed語法來表達所有條件。
因此,我們可以在while循環中讀取文件,將其切換為div塊,並且只有當塊的“作者”值等於某個電子郵件時,才會將一個值更改為另一個值。
#!/bin/bash
mail="test@example.com"
to_value_old=_toself
to_value_new=viewers
while IFS= read -r line; do
if [[ -z "$( echo "$line" | grep -o -P "^<\/div>$" )" ]]; then
entry_block="${entry_block}${line}\n"
else
entry_block="${entry_block}</div>\n"
entry_block="$( echo -e "${entry_block}" )"
if [[ -n "$( echo "${entry_block}" | grep -P "\<div class=\'author\'\>${mail}\<\/div\>" )" ]]; then
entry_block="$( echo "${entry_block}" | sed -r -e "s/<div\ class='to'>${to_value_old}<\/div>/<div\ class='to'>${to_value_new}<\/div>/" )"
fi
echo "${entry_block}"
entry_block=""
fi
done < ./text
我們得到了
$> ./div.sh
<div class='entry'>
<div class='pageurl'>temp/fhyw1</div>
<div class='context'>text</div>
<div class='subject'>testing</div>
<div class='notetext'></div>
<div class='signed'>USER</div>
<div class='author'>test@example.com</div>
<div class='color'>0</div>
<div class='visibility'>shared</div>
<div class='to'>viewers</div>
<div class='num'>4</div>
</div>
<div class='entry'>
<div class='pageurl'>temp/fhyw1</div>
<div class='context'>text</div>
<div class='subject'>testing</div>
<div class='notetext'></div>
<div class='signed'>USER</div>
<div class='author'>user@example.com</div>
<div class='color'>0</div>
<div class='visibility'>shared</div>
<div class='to'>_viewers</div>
<div class='num'>4</div>
</div>
完成。
這個sed解決方案可能適合您:
sed -e '/^<div class=.entry.>/,\_^</div>_{//!{H;d};\_^</div>_!{h;d};x;/author.>test@example.com/s/_toself/SUBSTITUTE TEXT/;p;x}' text_file
注意您需要將SUBSTITUE TEXT
替換為viewers
, _viewers
或其他任何內容
該sed
命令允許比之間的其它所有行<div class=.entry.>
和</dev>
( .
允許單'
或雙引號"
)穿過不變。如果線路開頭<div class=.entry.>
它被復制到寄存器調用保持空間(HS),然后刪除模式空間(PS)。所有其他行被附加到HS然后刪除接受行</div>
。當此行出現時HS被交換與PS並且如果該多行包含author.>test@example.com
然后SUBSTITUTE TEXT
代替_toself
。多行被打印出來而不管,則PS代替HS和其依次打印出來。
如果你只想用其他東西替換所有出現的_toself
,那么sed
將完美地完成這項工作。
sed 's/_toself/replacement_string/'
如果你只想在具有指定author
的div中執行此操作,那么它會更棘手。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.