8

私のシェルスクリプトで、実行すると./Test1 hello result.

標準入力として取りhello、結果を標準出力として受け取ることになっています。シェルは、、、およびの前<td>の空白をすべて削除する必要があります。</td>abc

だから、私はこのようにスクリプトを書きます

tr -d [:blank:] < $1
grep -r "<td>" $1 | sed -r 's/<td>//g' > $2
sed -r 's/<\/td>//g' $2
sed -r 's/abc//g' $2

ただし、このコマンドを実行すると、結果ファイルの内容は hello ファイルの内容とまったく同じになります (唯一の違いは、空白が削除されていることです)。

ファイル hello コンテンツ:

<td>hello</td>
  <td>hello</td>
    <td>hello</td>
<td>abc</td>
 <td>abc</td>

sedターゲット ファイルに変更を適用するにはどうすればよいですか?

4

6 に答える 6

7

変更をsedファイルに保存する場合は、次の-iオプションを使用します。

$ cat file
<head>abc</head>
    <td>hello</td>
      <td>hello</td>
        <td>hello</td>
    <td>abc</td>
     <td>abc</td>
<h1>abc</h1>

$ sed -ni '/<td>/{s/^\s*//;s/abc//;s/<\/\?td>//g;p}' file

$ cat file
hello
hello
hello

編集:別の区切り記号をsed使用し、拡張正規表現オプションを使用すると、正規表現はより明確になります-r

$ sed -r 's_</?td>__g' file
    hello
      hello
        hello
    abc
     abc

前の?文字をオプションにするため、正規表現を一致さ/せるために存在する必要はありません。<td></td>

于 2013-01-17T20:10:47.460 に答える
0

sed既存のファイルをその場で編集したい場合は、-iオプションを指定する必要があります。

UPD:そして、結果をどうするかが明確ではありませんtr(これで、スクリプトの標準出力になりますが、意図されていますか?)

于 2013-01-17T20:04:22.340 に答える
0

必要なのは、1 つの単純な sed または awk 置換行だけです。

sed -r 's/[[:blank:]]|<\/?td>|abc//g' file
awk '{gsub(/[[:blank:]]|<\/?td>|abc/,"")}1' file

例えば:

$ cat file
<td>hello</td>
  <td>hello</td>
    <td>hello</td>
<td>abc</td>
 <td>abc</td>

$ sed -r 's/[[:blank:]]|<\/?td>|abc//g' file
hello
hello
hello
于 2013-01-17T23:45:37.437 に答える
0

grep ソリューション:

kent$  echo "<td>hello</td>
  <td>hello</td>
    <td>hello</td>
<td>abc</td>
 <td>abc</td>"|grep -v 'abc'|grep -oP '(?<=<td>).*(?=</td>)'                                                                                                                
hello
hello
hello

awk ソリューション:

kent$  echo "<td>hello</td>
  <td>hello</td>
    <td>hello</td>
<td>abc</td>
 <td>abc</td>"|awk -F"</?td>" '!/abc/{print $2}'
hello
hello
hello
于 2013-01-17T21:38:08.387 に答える
-2

sed でファイルを変更する場合は、-e を渡す必要があります

于 2013-01-17T20:04:29.030 に答える