URL を解析してテキストを抽出し、ダウンロード時にファイルの名前を変更できるようにしようとしています。基本的に、これを行うためにシェルスクリプトに書きたいと思います。URLを文字列に収集してから、文字ごとに解析したいと思います。これはシェルスクリプトでどのように行うことができますか???
3 に答える
Substring Expansion
次の構文を使用して、文字列を 1 文字ずつ読み取ることができます。
${parameter:offset:length}
例:
str="abcd"
char=${str:1:1} # => "b"
Parameter length
そして、次の構文で文字列の長さを取得します。
${#parameter}
例:
${#str}
したがって、これを使用して文字を反復処理できます。
for (( i = 0; i < ${#str}; ++i)); do
echo "${str:$i:1}"
done
bash マニュアルから:
${#parameter}
Parameter length
. の値の文字数parameter
が置換されます。
${parameter:offset}
${parameter:offset:length}
Substring Expansion
.parameter
で指定された文字から始まり、length 文字まで展開されoffset
ます。
これにより、保存するファイル名が得られます。
url="http://www.example.com/path?foo#bar"
echo $(basename "${url%%[?#]*}")
# => "path"
使い方:
"${url%%[?#]*}"
?
andの後にあるものをすべて#
削除します (クエリとハッシュを削除します)$(basename "...")
最後のパス コンポーネント (最後の / の後の部分) を返します。
url='http://youtube.com/watch?v=Od3xkrxcsE8&feature=relmfu'
url=${url#*v=}
url=${url%%&*}
または、効率が悪い(外部コマンドを開始する)sedを使用できますが、より柔軟で、より複雑なケースでも読みやすくなります。
url='http://youtube.com/watch?v=Od3xkrxcsE8&feature=relmfu'
url=$(printf '%s' "$url" | sed 's+.*v=\([^&]*\).*+\1+')
シェル( /bin/sh
) では、${var#prefix-pattern}
とのみ${var%suffix-pattern}
が使用可能な文字列操作関数であることに注意してください。bashやzshにはもっと多くの機能がありますが、そのような拡張機能を使用していることに常に注意してください。システムによってはより単純なシェルがインストールされているものもあれば、システムによっては bash がまったくないもの (通常は Linux や組み込みシステム以外の Unix フレーバー) もあるためです。/bin/sh