2

次の命名規則を持つディレクトリ内のファイルのリストがあります:prefix_2chars_suffix
例:currentfile_aa_belongsToprojectForDep currentfile_bb_belongsToprojectForDep など。
「プレフィックスとサフィックスの間の2文字を抽出したかったので、sedを使用することを考えました。
次を試しました:

ls currentfile_* | sed 's/currentfile_\([..]\)_belongsToprojectForDep/\1/g'

私は得る:

sed: -e 式 #1、文字 44: 不明なコマンド: `\'

しかし、これを行う
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
と、動作します。つまり、構文に関するエラーは発生しません
。ここで何が間違っているのですか?

4

2 に答える 2

2

間に配置する必要はありません[]:

ls currentfile_* | sed 's/currentfile_\(..\)_belongsToprojectForDep/\1/g'

また、カットを使用することもできます:

ls currentfile_* | cut -f 2 -d _

より正確なフォームも

ls currentfile_??_belongsToprojectForDep | cut -f 2 -d _
于 2013-09-14T10:58:36.647 に答える
0

lsの出力を解析することは非常に悪い習慣です。さらに、sedはあなたの場合にはあまり役に立ちません ( sedを学びたいというコメントを読みましたが、代わりに、特定の状況で適切なツールを適切に使用することを学び、 lsの出力を解析しないことを学ぶことをお勧めします) )。代わりに、次の純粋なbashソリューションを検討できます。

for i in currentfile_??_*; do
    [[ $i =~ ^[^_]+_([^_][^_])_[^_]+$ ]] && echo "${BASH_REMATCH[1]}"
done

これはかなり堅牢なはずです。と併用すればさらに堅牢shopt -s nullglob

  • lsの出力を解析するのは好きではありません。代わりに glob を使用します。ここでグロブは、2 つの文字で区切られた 2 つのアンダースコアを持つファイル名のみをループするようにします。ここでは、ファイル名が多すぎる可能性があります。たとえば、ファイル名はcurrentfile_a__cool_file_is_very_coolorのcurrentfile____ilikeunderscores__ように一致します。
  • 見つかったファイル名の中で、正規表現を使用して、必要なもの、つまりアンダースコアが 2 つだけあるもの (つまり、アンダースコア以外の 2 つの文字で区切られているもの) をさらにフィルタリングします。
  • ${BASH_REMATCH[1]}、最初に一致したパターンに展開されます (正規表現の括弧に注意してください)。

最初のポイントは、lsパイプに対応するものです。最後の 2 点は、sedステートメントに対応するものです。

お役に立てれば!

于 2013-09-14T11:59:46.770 に答える