最後の質問から始めて:はい、strtok
改行を区切り文字として問題なく使用できます。
残念ながら、最初の質問に対する答えは、あまり肯定的ではありません。strtok
はすべての区切り文字を同等に扱い、単一の区切り文字と任意の数の連続する区切り文字を区別しません。つまり、|&;
区切り文字として指定すると、|||||||||
or&&&
または&|&|;
すべてがまったく同じように扱われます。
私はもう少し先に進みます: 私は四肢に出てstrtok
、シェルコマンドを構成要素に分割するのには単に適していないという事実として述べます.使用可能な結果を生み出すこの仕事。
特に、区切り記号として機能するものは何もありません。目的のために、&
、|
、および||
は独自のトークンです。シェルに提供される文字列では、それらを「考える」方法で区切り文字としての資格があるとは限りません。strtok
strtok
区切り文字以外の何物でもない区切り文字で区切られたトークンを対象としています。がトークンを読み取るときstrtok
、それらの間の区切り文字は完全に無視されます (さらに言えば、破棄されます)。シェルの場合、文字列 likeは実際には 3 つのトークンです -- 、、a|b
が必要です-- それらの間に安全に上書きしたり無視したりできるものは何もありません -- しかし、それは がどのように動作するかの要件です。最初の を配信するために、次の文字 (この場合は) を.で上書きします。次に、そのパイプを回復して、次のトークンがどうあるべきかを伝える方法がありません。a
|
b
strtok
strtok
a
|
'\0'
おそらく、代わりに貪欲なトークナイザーが必要だと思います。つまり、トークンにできる最長の文字列を構築し、現在のトークンの一部にならない文字に遭遇すると停止します。次のトークンを要求すると、(必然的に) 何もスキップ/無視せずに、前のトークンの終わりの後の最初の文字から開始します (もちろん、引用されていない空白のようなものに遭遇した場合)どういうわけか、おそらくそれをスキップします)。