私のディレクトリには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
コマンドの引数はsed
GNU拡張であるため、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