뒤에서부터 세어 특정 인덱스의 문자를 교체합니다.

뒤에서부터 세어 특정 인덱스의 문자를 교체합니다.

내가 만든 문자열의 일부 문자를 변경하고 싶습니다. 파일 목록을 만들었고 각 파일에 "통계" 정보를 추가해야 합니다. 예를 들어 파일 이름은 "K181_111126.CATProduct". "K181_111126.CATProduct.2011-11-28 13:33:33.722342000 +0100"필요하지 않은 마지막 16자는 다음과 같이 해결했습니다.

find . -type f -exec stat -c%n.%y {} \; | sed 's/.\{16\}$//'

결과: "K181_111126.CATProduct.2011-11-28 13:33:33" 내 문제는 날짜와 시간(다음 9번째 문자) 사이의 공백을 "-"로 변경하고 시간(13:33:33)의 모든 ":"를 점 ""으로 변경해야 한다는 것입니다.
밧줄의 길이가 모두 다르기 때문에 뒤에서부터 셀 수 밖에 없습니다.

답변1

공백과 콜론을 모두 바꾸려면 약간 더 긴 정규식을 사용하십시오.

find . -type f -exec stat -c%n.%y {} \; |
sed 's/ \(..\):\(..\):\(..\).\{16\}$/-\1.\2.\3/'

마지막 24번째 문자 이전의 공백과 일치한 다음 다음 2개 문자, 쉼표, 다음 2개, 쉼표 및 또 다른 2개를 일치시키고 캡처한 다음 마지막 16개를 일치시키고 모든 콘텐츠로 대체합니다. 캡처된 첫 번째 표현식은 역참조를 사용하여 호출할 수 있습니다 \1(두 번째는 \2등을 사용하여). 즉, 공백 뒤의 두 숫자는 자체적으로 "대체"됩니다. 즉, 효과적으로 유지되고 점, 다음 두 숫자 등이 이어집니다.

답변2

나는 이것이 당신이 찾고 있는 것이라고 생각합니다:

$ s='K181_111126.CATProduct.2011-11-28 13:33:33.722342000 +0100'
$ echo "$s" | rev | sed -E 's/.{16}//; s/:/./; s/:/./; s/ /-/' | rev
K181_111126.CATProduct.2011-11-28-13.33.33

rev이는 처리하기 쉽도록 입력 라인을 문자별로 반전하는 데 사용되며 마지막으로 rev다시

  • s/.{16}//처음 16자 삭제
  • s/:/./; s/:/./처음 두 개를 :다음으로 변경하십시오..
  • s/ /-/첫 번째 공백을 다음으로 변경하십시오.-

답변3

find ... |
sed -Ee '
  s/.{16}$//
  :a;s/:([^:[:blank:]]*)$/.\1/;ta
  s/[[:blank:]]([^[:blank:]]+)$/-\1/
'

당신처럼 후행 16자를 제거한 후 단계별로 변환하는 루프를 설정했습니다 - :> .그리고 완료되면 마지막 가장 흰색 문자를 대시로 변경합니다. 파일 이름에 공백 문자가 포함될 수도 있고 이를 무시해야 하기 때문에 이는 필요합니다.

관련 정보