bash脚本替换单词

时间:2011-11-11 11:45:46

标签: linux bash

希望在服务器上运行脚本以查看文件的路径并替换单词,而在div中匹配。

因此需要将_toself替换为作者等于特定电子邮件test@example.com的观众

URL = /无功/网络/服务器/温度/ 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>

3 个答案:

答案 0 :(得分:1)

我们有一些文字

$> 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-blocks并仅在块'作者'的值等于某个电子邮件时才更改一个值。

#!/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>

完成。

答案 1 :(得分:1)

此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

N.B。您需要将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,然后打印出来。

答案 2 :(得分:0)

如果您只想用其他内容替换所有出现的_toself,那么sed将完美地完成这项工作。

sed 's/_toself/replacement_string/'

如果你只想在具有指定author的div中执行此操作,那么它会有点棘手。