希望在服务器上运行脚本以查看文件的路径并替换单词,而在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>
答案 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中执行此操作,那么它会有点棘手。