web-dev-qa-db-ja.com

2つの二重引用符の間にsed get substringを使用する

ファイルがあります

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が機能していません。

14
XemX

Rsyncコマンドのstderrをawkスクリプトにパイプすることができます:

awk -F '"' '{print $2}' 

または、次のようなカットコマンドに:

cut -d'"' -f2
17
anubhava

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行から、二重引用符を含む次の行に、まったく編集せずに印刷します。それがあなたにとってそれがうまくいかなかった理由です—それはあなたが要求したことをしました、しかしあなたがそれをするように要求したことはあなたがそれをするように要求することを意図したものではありませんでした。

効率の面では、パフォーマンスに測定可能な差がある可能性はほとんどありません。メンテナンスのしやすさという点では、後者は脳細胞への負担が少ないと思います。

6

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
1
Steve