2つのファイルがあります。
- ファイル1 = ABC2019120601C
- ファイル2 = ABC2019120611C
ls -l ABC * Cを入力すると、2つのファイルがすべて出力されます。正しい文字位置でファイルを見つける方法はありますか?
例えば
- 最初の位置 = A
- 2番目の位置= B
- 3番目の位置= C
- ビット14 = C
これにより、ABC2019120601Cファイルのみが出力されます。可能であれば助けてください。
答え1
ゼロ個以上の文字を一致させる?
のではなく、単一の文字を一致させるために使用できます。*
例えば
ls -ld ABC??????????C
しかし、参考にしてください両方サンプルファイル名は基準と一致します(12文字目のみ)。
答え2
を使用すると、zsh
次のことができます。
set -o extendedglob # best in ~/.zshrc
ls -ld ABC?(#c10)C*
ここでは、前の原子の繰り返し間隔を指定する(#cx,y)
正規表現に似ています(ここでは単一文字に一致)。{x,y}
?
ksh93の対応する内容は次のとおりです。
ls -ld ABC{10}(?)C*
bash
/sh
には該当しませんが、文字が含まれていないと$IFS
仮定すると、?
次のことができます。
repeat() {
awk -- '
BEGIN {
for (i = 0; i < ARGV[1]; i++) printf "%s", ARGV[2]
if (ARGV[1]) printf "\n"
}' "$@"
}
ls -ld ABC$(repeat 10 '?')C
ksh93 を使用して位置別に検索するには、予測演算子を使用できます。
ls -ld ~(P:(?=.{0}(A))(?=.{1}(B))(?=.{2}(C))(?=.{13}(C))*
オフセットは0、1、2、13です。
~(P:...)
:ksh93 glob にはさまざまな構文があります。 Perlに似た正規表現がここで使用されます。(?=...)
内部的に一致する場合は、幅がゼロの位置で一致するPerlなどの順方向検索アサーションです。.{13}(C)
:Cの後に13文字が続くものと一致します。すべての(?=...)
一致項目の幅が 0 なので、項目の先頭ですべて一致します。 ksh93のバグを修正する.{13}(C)
代わりに使用します。.{13}C
を使用すると、zsh
glob修飾子でPCREマッチングを実行して同じことを実行できます。
set -o rematchpcre
ls -ld *(e['[[ $REPLY =~ "^(?=.{0}A)(?=.{1}B)(?=.{2}C)(?=.{13}C)" ]]'])
または
ls -ld *(e['[[ $REPLY[1,3]$REPLY[14] = ABCC ]]'])
または、次のヘルパー関数を使用してください。
offsets() {
local c o
for o c {
[[ $REPLY[o] = $c ]] || return
}
}
ls -ld *(e['offsets 1 A 2 B 3 C 14 C'])