내가 만든 문자열의 일부 문자를 변경하고 싶습니다. 파일 목록을 만들었고 각 파일에 "통계" 정보를 추가해야 합니다. 예를 들어 파일 이름은 "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자를 제거한 후 단계별로 변환하는 루프를 설정했습니다 - :
> .
그리고 완료되면 마지막 가장 흰색 문자를 대시로 변경합니다. 파일 이름에 공백 문자가 포함될 수도 있고 이를 무시해야 하기 때문에 이는 필요합니다.