ファイルに 1 行だけ残るまでシェルスクリプトを実行します。

ファイルに 1 行だけ残るまでシェルスクリプトを実行します。
#!/bin/sh
echo "file to split?"
read file
f=0
until ! [ -s $file ];
do
        grep -n "<text" $file > titles.txt
        lines=$(cat titles.txt| sed -n 2'p' | sed -r 's/^([0-9]*).*/\1/g')
        f=$((f+1))
        substrac="$(($lines-1))"
        head -$substrac $file > $f
        sed -i '1,'$substrac'd' $file
        echo "file \"$f\" generated"
done

スクリプトは空になるまで実行されますが、「titles.txt」ファイルに1行が残るか、$ fileに「」が1回表示されるまで$file実行する必要があります。<text

私は試した:

while :
do
        count=$(grep "<text" $file | wc -l)
if [ $count > 1 ]
then

そして:

while :
count=$(cat titles.txt | wc -l);
do
until [ $count -eq 1 ]; do

しかし、その時点でスクリプトを停止することはできません。私が何か間違っていることは確かですが、何も見つかりません...

ベストアンサー1

ファイルが正しい形式のXMLファイルであり、<text>ノードを別々のファイルに抽出したい場合は、XMLStarletを使用して次のことを実行できます。

#!/bin/sh

infile="$1"

xmlstarlet sel -t -v '//text/@id' -nl "$infile" |
while read id; do
    xmlstarlet sel -t --var id="'$id'" -v '//text[@id = $id]' "$infile" >"$id.txt"
done

コマンドラインに次のファイルのパス名を入力します。

<?xml version="1.0"?>
<root>
  <text id="cade2296-1">
The first text, called "cade2296-1".
</text>
  <text id="cafr3062-1">
The second text, called "cafr3062-1".
</text>
</root>

...これは現在のディレクトリに2つのファイルを作成し、cade2296-1.txtcafr3062-1.txtのファイルの2つのタグの内容を含みます。<text>

ファイル名はラベルidの属性から取得されます<text>idこれらの値は最初にXMLから抽出され、次にループから関連タグ値を抽出するために使用されます。

ループ内でXMLStarlet呼び出しを次-vのように変更すると、次のような結果が得られます。-cコピー<text>タグのデータだけでなく、XMLタグのコンテンツです。

おすすめ記事