Text-Processing

使用bash替換html標籤內的文件

  • December 24, 2020

我有一個 HTML 文件,我需要將段落元素 () 中的文本替換為與to<p>相同的大寫字母。<p>hi</p>``<p>HI</p>

x=`cat $1 | grep -o '<p>.*</p>' | tr '[:lower:]' '[:upper:]'`
var2=`echo $x`
headerremove=`grep -o '<p>.*</p>' $1`
var3=`echo $headerremove`
echo $var2
echo $var3
sed 's/$var3/$var2/g' "$1"

Input
<h1>head</h1>
<p>hello</p>

Output
<p>HELLO</p>

這沒有按預期工作。此外,我需要刪除所有其他細節,例如除段落元素之外的所有標籤及其子元素。

$ cat f.html
<h1>head</h1>
<p>hello</p>
<p>world</p>
$ grep -o '<p>.*</p>' f.html | tr '[:lower:]' '[:upper:]' | sed 's/P>/p>/g'  
<p>HELLO</p>
<p>WORLD</p>


# capture other tags: grep multi-pattern e.g 'patt1\|patt2\|pattN'
$ grep -o '<p>.*</p>\|<h1>.*</h1>' f.html | tr '[:lower:]' '[:upper:]' | sed 's/P>/p>/g;s/H1>/h1>/g'
<h1>HEAD</h1>
<p>HELLO</p>
<p>WORLD</p>

# add line after h1 tag : grep+tr+sed
function foo () {
   grep -o '<p>.*</p>\|<h1>.*</h1>' "${1}" | tr '[:lower:]' '[:upper:]' | sed 's/P>/p>/g;s/H1>/h1>/g' | while read line; do 
       case "${line}" in
           "<h1>"*)
               echo "${line}"
               echo "anything that should appear after h1 tags"
           ;;
           "<p>"*)
               echo "${line}"
           ;;
       esac
   done
}

$ foo f.html
<h1>HEAD</h1>
anything that should appear after h1 tags
<p>HELLO</p>
<p>WORLD</p>

# add line after h1 tag : few [shell parameter expansion] tips + while & case statments 
function foo () {
   grep -o '<p>.*</p>\|<h1>.*</h1>' "${1}" | while read line; do 
       case "${line}" in
           "<h1>"*)
               line="${line^^}"; #capitalize (shell parameter expansion)
               echo "${line//H1>/h1>}" # find replace (shell parameter expansion)
               echo "anything that should appear after h1 tags"
           ;;
           "<p>"* | "<P>"*) # if html files contain capitalized P tag and you wanna capture them 
               line="${line^^}"; #capitalize
               echo "${line//P>/p>}" # find replace
           ;;
           "<foo>"*)
               line="${line^^}"; #capitalize 
               linopenintag="${line//<foo>/}"; # <foo>hello world</foo> ==> hello world</foo>
               innerHTML="${linopenintag//<\/foo>/}"; # hello world</foo> ==> hello world
               innerHTMLarr=(${innerHTML});  # in case i want to put each word in a spin or/and style that word differently 

               for eachword in ${innerHTMLarr[@]}; do
                   if [[ "${eachword}" == "something" ]]; then # capture special words ... 
                       echo "<bar style='...'> ${eachword} </bar>"
                   else
                       echo "<bar> ${eachword} </bar>"
                   fi
               done

           ;;
       esac
   done
}
$ foo f.html 
<h1>HEAD</h1>
anything that should appear after h1 tags
<p>HELLO</p>
<p>WORLD</p>

xmllint+**sed**解決方案:

xmllint --html --xpath "//p" input.html | sed 's/>[^<>]*</\U&/'

輸出:

<p>HELLO</p>

引用自:https://unix.stackexchange.com/questions/440070