동일한 패턴에 대해 두 가지 작업을 수행했습니다.

동일한 패턴에 대해 두 가지 작업을 수행했습니다.

다음 sed명령을 사용하여 특정 형식의 파일 이름을 표시합니다.

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

BOH_Contour.png이름이 두 개의 파일이 있고 BOV_Web.png다음을 얻는다면

BOH_Contour/BOH_Contour,
BOV_Web/BOV_Web,

_이제 이 결과의 두 번째 부분에 있는 모든 내용을 삭제하고

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

모든 이름에 밑줄이 포함된 경우 이름의 두 부분을 별도로 일치시키기만 하면 됩니다. 줄의 어느 부분도 바꾸고 싶지 않고 파일 이름 끝 부분만 바꾸고 싶으므로 수정자를 잃습니다 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

관련 정보