“.”가 있으면 시작 부분에 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
답변
우리는 중 하나 사용할 수 있습니다 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
무엇에 들어가는 것은 { ... }
앞에 추가하는 것이 코드 $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
)
답변
sed로 :
sed -e "/^.\./s/^/0/" file.txt
이 패턴 /^.\./
은 줄의 시작 부분에서 모든 문자와 리터럴 점을 찾고 ^
, 일치하면 줄의 시작 부분을 s
0으로 대체하여 시작 부분에 0을 효과적으로 추가합니다.
sed expressoin s/.\{0\}/0/
은 다소 이상하며 0 개 이상의 사본과 일치하며 0으로 대체됩니다. 물론 패턴은 문자열의 모든 위치에서 일치하지만 s///
첫 번째 일치 만 대체하므로 의도 한대로 작동합니다. 그래도 기발한 방법입니다.
또는 awk를 사용하면 비슷한 정규 표현식이 줄에 일치하지만 다음을 사용할 수 있습니다 substr
.
awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt
먼저 두 번째 문자가 점인지 테스트 한 다음 줄 앞에 0을 추가합니다. 마지막 작업은 수정 후 줄을 인쇄하는 기본 작업을 호출합니다.
답변
당신은 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 날짜 및 배쉬) : date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
답변
다른 답변에서 제시된 것과 다른 전략 : “.”을 사용할 수 있습니다. 필드 구분자로.
awk -F. '$1 < 10 {printf "0"} {print}' /tmp/in.txt
당신은 이것을 골프 할 수 있습니다 :
awk -F. '$1<10{printf "0"}1' /tmp/in.txt
sed의 경우 다른 명령에 대한 짧은 명령이 있습니다.
답변
sed를 사용하면
sed 's/^\(.\)\.\(.*\)/0\1.\2/'
이것은 ^
줄의 시작 부분에 고정한 다음 그룹에서 단일 문자를 캡처 .
한 다음 리터럴을 붙인 다음 다른 것을 사용합니다. 우리가 일치하는 것을 인쇄하면 0
첫 번째 캡처 그룹 (줄의 시작 부분에있는 문자), .
두 번째 캡처 그룹 (줄의 나머지 부분)