ファイルがあります
xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
"/home/path/to/file1": Permission denied (13) rsync:
"/home/path/to/file2": Permission denied (13) rsync:
"/home/path/to/file3": Permission denied (13)
次に、ファイルパスのみを抽出し、それを別のファイルに保存します。出力ファイルは次のようになります:
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
Sedまたはawkを使用してこれを行うにはどうすればよいですか?
私が試してみました sed -n '/"/,/"/p' myfile
が機能していません。
Rsyncコマンドのstderrをawkスクリプトにパイプすることができます:
awk -F '"' '{print $2}'
または、次のようなカットコマンドに:
cut -d'"' -f2
sed
の使用:
sed 's/^[^"]*"\([^"]*\)".*/\1/'
これは、行の先頭、一連の非引用符、二重引用符を検索し、一連の非引用符、二重引用符、および行上のその他のものをキャプチャし、キャプチャした素材で置き換えます。
$ sed 's/^[^"]*"\([^"]*\)".*/\1/' <<'EOF'
> xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
> "/home/path/to/file1": Permission denied (13) rsync:
> "/home/path/to/file2": Permission denied (13) rsync:
> "/home/path/to/file3": Permission denied (13)
> EOF
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
$
GNU sed
を使用してRHEL 5 Linuxでテストしますが、7th Edition UNIX™バージョンのsed
で機能する機能のみを使用します。
ちなみに、少し簡単な方法は、2つの代替コマンドを使用することです。最初の二重引用符までのすべてを空の文字列に変更します(これは0個以上の非引用符とそれに続く二重引用符のシーケンスです)。最初の二重引用符の後にあるすべてのものを何も変更しません。
sed 's/^[^"]*"//; s/".*//'
ちなみに、実行したコマンド( `sed -n '/" /、/ "/ p')は、二重引用符を含む1行から、二重引用符を含む次の行に、まったく編集せずに印刷します。それがあなたにとってそれがうまくいかなかった理由です—それはあなたが要求したことをしました、しかしあなたがそれをするように要求したことはあなたがそれをするように要求することを意図したものではありませんでした。
効率の面では、パフォーマンスに測定可能な差がある可能性はほとんどありません。メンテナンスのしやすさという点では、後者は脳細胞への負担が少ないと思います。
grep
のバージョンがPerl-regexpをサポートしている場合:
grep -oP '(?<=")/home/.*?(?=")' file >> anotherfile
結果:
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
また、必要に応じて、これをより厳密にせずに、ダブルス間のすべてに一致させることもできます。
grep -oP '(?<=")[^"]*' file >> anotherfile