ディレクトリから.txtファイルの先頭と末尾の文字列を削除しますか?

ディレクトリから.txtファイルの先頭と末尾の文字列を削除しますか?

私のディレクトリには1行の.txtファイルセットがあります。すべて同じ基本形式を持ち、以下の「入力」という場所に貼り付けました。

ディレクトリ内の各ファイルの先頭と末尾の文字列を削除し、興味のあるテキストのみを含む各ファイルを「出力」として表示したいと思います。

入力する:
<s> Text here that I want to keep </s> (31ca4166c37a_.76)

出力:
Text here that I want to keep

どんな助けでも大変感謝します。

答え1

ファイルを編集するには、以前の方法を使用してくださいed

for file in dir/*.txt; do
  ed -s "$file" <<'EOF'
s!^<s> *!!
s!</s>.*$!!
w
EOF
done

(通常、非標準について考えるほとんどの場合、sed -i非標準を代わりに使用することを検討する必要がありますed。)

答え2

sedで

sed -i.bak 's|^<\/s>\s\(.*\)\s<\/s>.*$|\1|' 1-line.txt

テスト

echo "</s> Text here that I want to keep </s> (31ca4166c37a_.76)" | sed 's|^<\/s>\s\(.*\)\s<\/s>.*$|\1|'
Text here that I want to keep

フォルダ内のすべてのファイルに適用するには、sedだけでは不可能です。findこのユーティリティは少なくとも次のように使用する必要があります。

find . -type f -exec sed -i.bak 's|^<\/s>\s\(.*\)\s<\/s>.*$|\1|' {} \;

このコマンドは、.bak変更された各ファイルのファイルを生成します。

メモ:

  • -iコマンドの引数はsedGNU拡張であるため、BSDでこのコマンドを実行する場合は、sed出力を新しいファイルにリダイレクトしてから名前を変更する必要があります。
  • POSIXで指定されていますが、一部のfind実装にはパラメータがないため、代わりに-exec使用する必要があります| xargs

答え3

私はこれを提供する:

sed 's;^[[:blank:]]*<[^>]*>[[:blank:]]*\(.*\)<.*>.*$;\1;' foo

出力:

Text here that I want to keep

これは、ラベルに複数の文字とランダムな文字があり、開始と終了のすべてのスペースが削除された場合に機能します。たとえば、次のようになります。

<br> Text here that I want to keep    </br> (31ca4166c37a_.76)

答え4

POSIX awkの場合(提供された入力例のように、すべてと<s>doがすべての行に順次ペアで表示されると仮定):</s>

$ awk -F'[[:blank:]]*</?s>[[:blank:]]*' '{print $2}' file
Text here that I want to keep

略語にはGNU awkを使用してください\s

$ gawk -F'\\s*</?s>\\s*' '{print $2}' file
Text here that I want to keep

POSIX sedの場合:

$ sed 's|[[:blank:]]*<s>[[:blank:]]*\(.*[^[:blank:]]\)[[:blank:]]*</s>.*|\1|' file
Text here that I want to keep

関連情報