修正するより具体的な正規表現のためにスクリプトを少し編集しましたが、まだ同じ問題があります。
次の質問を明確にするために、これは作業を開始したい正確なスクリプト(より大きなスクリプトの場合はPOC)で、test.txtは私のtest.shファイルと同じディレクトリにあり、次からスクリプトをCDにコピーしています。同じディレクトリ。
また、はんだ付け中にキャリッジリターンに関連している可能性があると思いましたが、まだ何が間違っているのかわかりません。
アップデート終了
ここでbashファイルを貼り付ける方法を見てみましたが、それを実行して特定のファイルからバージョン番号を抽出し、変数を介してそのバージョン番号で操作を実行できます。スクリプトの残りの部分は、パラメータ$ 1を介してバージョンを提供すると機能しますが、作業したいフォルダ内のファイルから直接バージョン番号を確認できることをお勧めします。
これは私の現在のスクリプトです。
#!/bin/sh
version=$(sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p" test.txt)
printf 'detected version %s for test.txt\n' "$version"
端末からこの値を返します。
for test.txtion 0.6
印刷したい文字列の一部を覆っているようです。この部分だけを見るとこんな感じです。
sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p" test.txt
たとえば、この行を含むファイルに行があると機能します。
Version: 0.6
わかりました:
root@webserver [/home/username]# sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p" test.txt
0.6
root@webserver [/home/username]#
スクリプトにどのような問題があったと思いますか?
答え1
ダメな理由と解決方法を見つけました。私のOPで@eikeが述べたように、問題はDOSのキャリッジリターン\ rが出力を上書きすることです。私にとってもっと問題になるのは、何らかの理由で私の変数に\ rが追加されることです。
ファイルは定期的に更新されるため、手動で\ rを削除することはできません。
いくつかの検索を行った後、私の問題を解決し、文字列を正しく印刷したことがわかりました。
#!/bin/bash
version=$(sed 's/\r$//' test.txt | sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p")
printf 'detected version %s for test.txt\n' "$version"
ここで行うことは、まずテキストから\ rを削除し、それを正規表現部分に渡すことです。期待される結果を得る。
検出された test.txt バージョンは 0.6 です。
\rを無視する正規表現でこれを行う方法があると確信していますが、少なくともこれは完了です!