同じパターンに対して2つのことを行いました。

同じパターンに対して2つのことを行いました。

sedのコマンドを使用して、特定の形式のファイル名を表示します。

ls -1 *|sed 's/^\(.*\).png/\1\/\1,/g'

BOH_Contour.png名前が2つのファイルがあり、次のものをBOV_Web.png取得する場合

BOH_Contour/BOH_Contour,
BOV_Web/BOV_Web,

_これで、この結果の2番目の部分のすべての内容を削除します。

BOH_Contour/BOHContour,
BOV_Web/BOVWeb,

どうすればいいですか?

答え1

一般的に使用する場所は次のとおりです。捕まえるスペース:

ls | sed '
  /\.png$/!d; # discard everything but lines ending in .png
  s///;       # remove that .png
  h;          # store on the hold space
  s/_//g;     # remove underscores
  H;          # append (with a newline) to the hold space
  g;          # retrieve that hold space
  s|\n|/|;    # substitute the newline with a /
  s/$/,/;     # add that extra comma.'

答え2

sed次のように他の式を追加するだけです;

sed 's/^\(.*\).png/\1\/\1,/g;s,/\(.*\)_,/\1,'

しかし覚えてくださいコマンドを解析するのはls良い習慣ではありません。

答え3

助けることができます:

ls -1 *|sed 's/^\(.*\).png/\1\/\1,/g ; : 1 ; s|_\([^/]*$\)|\1|; t 1'

_またはファイル名が1つしかない場合

ls -1 *|sed 's/^\(.*\).png/\1\/\1,/g ; s|_||2'

答え4

すべての名前にアンダースコアが含まれている場合は、名前の2つの部分を別々に一致させるだけです。行のどの部分も変更したくなく、ファイル名の末尾のみを変更したいので、修飾子を失いますg

ls | sed 's/^\(.*\)_\(.*\)\.png$/\1_\2\/\1\2,/'

ちなみに、これは対話なしで使用したときの効果ls -1と同じです。 Not equalの主な違いは、現在のディレクトリにサブディレクトリが含まれている場合は現在のディレクトリのエントリが一覧表示され、サブディレクトリ以外のエントリはすべてのサブディレクトリの内容とともに一覧表示されることです。これがほとんど役に立たないことを考えると、おそらく。lsls *lslsls *ls

どんなアンダースコアがあっても、すべてのアンダースコアを削除するにはsedを使用できますが、awkはよりきれいです。

ls | awk 'sub(/\.png$/, "") {$0 = $0 "/" gsub(/_/, "", $0) ","} 1'

または、シェルループを使用できます。

for x in *; do
  case $x in
    *.png) x=${x%.png}; printf '%s/\n' "$x"; printf '%s,\n' "$x" | tr -d _;;
  esac
done

関連情報