
"."가 있는 경우 시작 부분에 0을 추가하려고 합니다. 해당 줄의 두 번째 문자에. 나는 이 두 가지를 결합할 수 없었습니다.
awk '{ print substr( $0, 2, 1 ) }' file.txt
두 번째 문자 표시
sed -ie "s/.\{0\}/0/" file.txt
처음에 0을 추가합니다.
"두 번째 문자가 점인 경우"가 있어야 합니다.
샘플 파일:
1.02.2017 23:40:00
10.02.2017 23:40:00
결정적인:
01.02.2017 23:40:00
10.02.2017 23:40:00
답변1
문제를 완전히 해결하기 위해 sed
또는 중 하나를 사용할 수 있습니다 .awk
와 함께 sed
:
$ sed 's/^.\./0&/' file.txt
&
대체 명령( )의 대체 부분에서 발생하는 경우 s
명령의 패턴 부분과 일치하는 입력 행 부분으로 확장됩니다.
정규 표현식 ^.\.
은 "^
( )로 시작하고 임의의 문자( .
) 뒤에 문자 그대로 점( \.
) 이 오는 모든 행과 일치합니다.".
행이 이면 1.02.2017 23:40:00
패턴이 일치하고 행 시작 부분 1.
에서 로 대체됩니다 .01.
와 함께 awk
:
awk
질문의 부분 코드를 기반으로 구축 중 ...
명시된 대로 이는 각 입력 줄의 두 번째 문자를 인쇄합니다.
$ awk '{ print substr($0, 2, 1) }' file.txt
두 번째 문자를 반환 한다는 사실을 substr($0, 2, 1)
조건으로 사용할 수 있습니다.
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
이전 조건이 true인 경우 현재 줄의 내용인 0을 { ... }
앞에 추가하는 코드가 들어갑니다 .$0
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
그런 다음 모든 줄이 인쇄되는지 확인하면 됩니다.
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
물론 조건은 substr($0, 2, 1) == "."
정규 표현식으로도 변경될 수 있습니다(우리는 솔루션에서 사용한 것과 정확히 동일한 표현식을 사용합니다 sed
).
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
"더 짧은 것이 항상 더 좋다"고 생각하는 일부 사람들은 다음과 같이 쓸 것입니다.
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(아마도 대부분의 공백을 제거할 것입니다: awk '/^.\./{$0="0"$0}1' file.txt
)
답변2
sed 사용:
sed -e "/^.\./s/^/0/" file.txt
패턴은 /^.\./
line 시작 부분에서 모든 문자와 리터럴 점을 찾고 ^
, 일치하는 경우 s
해당 줄 시작 부분을 0으로 대체하여 효과적으로 시작 부분에 0을 추가합니다.
sed 표현은 s/.\{0\}/0/
다소 이상합니다. 0개 이상의 복사본과 일치하고 0으로 대체됩니다. 패턴은 물론 문자열의 모든 위치에서 일치하지만 s///
첫 번째 일치만 대체하므로 의도한 대로 작동합니다. 하지만 기이한 방법입니다.
또는 awk를 사용하면 유사한 정규식을 사용하여 행을 일치시킬 수 있지만 다음을 사용할 수 있습니다 substr
.
awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt
먼저 두 번째 문자가 점인지 테스트한 다음 점인 경우 줄 앞에 0을 추가합니다. 마지막 것은 수정 후 줄을 인쇄하는 기본 작업을 호출합니다.
답변3
awk 및 sed라고 말씀하셨는데 날짜 형식을 지정하려는 것 같으니 이를 위해 명령을 사용하겠습니다 date
. 예를 들어:
echo '1.2.2017 23:40:00' | sed 's/\./\//g' | xargs -0 date '+%m.%d.%Y %T' -d
출력됩니다
01.02.2017 23:40:00
sed
중간에 있는 명령은 에 입력할 마침표를 슬래시로 변경 합니다 date -d
. 형식 옵션을 사용하면 원하는 거의 모든 형식으로 출력할 수 있습니다. 특히 %m
당신이 하려는 것처럼 보이는 월의 제로 패드가 됩니다.
Kusalananda는 다음과 같이 지적합니다.
훨씬 더 컴팩트합니다(GNU 날짜 및 Bash):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
답변4
sed를 사용하면 가능합니다
sed 's/^\(.\)\.\(.*\)/0\1.\2/'
이는 줄의 시작 부분에 고정하는 데 사용되며 ^
, 그룹의 단일 문자, 리터럴 .
및 기타 항목을 캡처합니다. 일치하면 a 0
, 첫 번째 캡처 그룹(줄 시작 부분의 문자), .
두 번째 캡처 그룹(줄의 나머지 부분)을 인쇄합니다.