簡體   English   中英

bash腳本替換單詞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM