
というファイルがありますfoo.txt
。このファイルには次の値が含まれています。
abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz
私はこのような出力を得たい
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz
同じ値/テキストが元の値/テキストの前に表示される必要があります。正規表現を使用してどのようにこれを達成できますか?
%s/^[a-z_-]*./\1/g
上記の表現を使用しましたが、出力が間違っています。
答え1
キャプチャグループ:help /\(
パターンに一致する項目を内部に保存できます。その後、\(...\)
代替アイテム(または後でパターン自体)で一致を参照できます(\1
最初のグループ\2
などを介して)。
問題を解決する1つの方法(いくつかあります)は、.tar.gz
拡張子の前にファイル名をキャプチャすることです。置換には、キャプチャ(\1
)、スペース、元のテキスト(\0
、、または&
)を配置します。
:%substitute/\(.*\)\.tar\.gz$/\1 &/
または、拡張子の前にあるものを一致させて(一致終了のために\ze
)コピーすることもできます。
:%substitute/.*\ze\.tar\.gz$/& &/
試みに問題があります。
- 逆参照を使用しましたが、
\1
何もキャプチャしませんでした。 [a-z_-]
literalと一致しませんが、.
これはあなたの例に現れます。.
最後のエンディング(例:)から外れる方法はありません\.
。これはすべての文字と一致します。- 部品の交換には重複はありません。テキストを追加するのではなく、効果的に削除できます。
答え2
.tar.gz が常に削除される場合:
%s/^\(.*\).tar.gz/\1 \1.tar.gz/g
答え3
ファイル名: testt
abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz
注文する
sed "s/[a-z]\{3\}\.\{0,1\}-\{0,2\}\.\{0,1\}[0-9]\{0,1\}\.\{0,1\}[0-9]\{0,1\}/& &/" test| sed "/[a-z]\{3\}\. /s/\.//1"
出力
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz
答え4
必ずそうでしょうかvi
?
それ以外の場合は、必要に応じて実行できます(GNUを使用xargs
)。
cat foo.txt | xargs -i basename {} .tar.gz | xargs -i echo {} {}.tar.gz
foo.txt
ファイルはどこにありますか?
直す。
$ cat foo.txt
abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz
$ cat foo.txt | xargs -i basename {} .tar.gz | xargs -i echo {} {}.tar.gz
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz
上記の内容を理解できませんでしたか?