날짜와 시간이 다른 텍스트가 너무 많아서 패턴으로 사용할 수 없는데, 첫 번째 ,
와 인쇄 후 "
, 두 번째 ,
와 인쇄 전을 검색할 수 있는지 궁금합니다 "
. 다음과 같아야 합니다.
4,"2014-05-08 18:22:24",14718202,4,184
4,"2014-05-09 22:07:11",1278184,4,221
3,"2014-05-05 10:01:24",1238461,1,222
이제 다음과 같습니다:
4,2014-05-08 18:22:24,14718202,4,184
4,2014-05-09 22:07:11,1278184,4,221
3,2014-05-05 10:01:24,1238461,1,222
미리 감사드립니다.
답변1
매우 간단한 방법은 말한 것처럼 첫 번째와 두 번째 쉼표를 바꾸는 것입니다.
sed 's/,/,"/;s/,/",/2' infile
날짜를 일치시키려는 경우가 아니면(모든 행의 형식이 동일하다고 가정):
sed 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\ [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\)/"&"/' infile
또는 첫 번째와 두 번째 쉼표 사이의 모든 내용:
sed 's/^\([^,]*,\)\([^,]*\)\(,.*\)/\1"\2"\3/' infile
답변2
날짜/시간 필드를 참조하고 싶다고 말씀하셨나요?
awk 'BEGIN {FS=OFS=","} $2="\""$2"\""' infile > outfile
답변3
다른 방법:
sed 's/,\([^,]*\),/,"\1",/' <infile >outfile
최소한 두 개의 쉼표가 없는 줄에서는 작동하지 않습니다. 따라서 최소한 두 개의 쉼표가 없는 줄은 완전히 건너뜁니다. 기본 정규식 패턴은 다음을 기반으로 하기 때문에 항상 처음 두 개의 쉼표만 가져옵니다.왼쪽이 제일 길어요규칙 - 즉, 경기는 항상 다음과 같습니다.곧가능한 한 그리고 가능한 한 많이긴가능한 한 많이. 즉, 한 줄에서 발견된 첫 번째 쉼표는 우리가 찾고 있는 첫 번째 쉼표를 만족시키며, 다음 쉼표는 항상 그 사이에 있는 쉼표가 아닌 문자의 가장 긴 순서를 따릅니다.
sed 's/,\([^,]*\),/,"\1",/
' <<\IN
4,2014-05-08 18:22:24,14718202,4,184
4,2014-05-09 22:07:11,1278184,4,221
3,2014-05-05 10:01:24,1238461,1,222
IN
첫 번째 쉼표와 일치하고 그 뒤에 [^,]*
0개 이상의 쉼표가 아닌 *
문자가 오고 그 뒤에 쉼표가 옵니다. 쉼표가 아닌 일치 항목을 하위 표현식으로 그룹화하고 첫 번째 항목을 역참조합니다.[^
,]*
\(
\)
\1
(여기서 만)바꾸기 문 오른쪽에 있는 바꾸기 필드의 일치 그룹입니다 s///
. 쉼표 ,"
는 쉼표와 따옴표, 따옴표 ",
와 쉼표 로 직접 대체되지만 역참조 그룹은 스스로 대체됩니다. 그래서...
산출
4,"2014-05-08 18:22:24",14718202,4,184
4,"2014-05-09 22:07:11",1278184,4,221
3,"2014-05-05 10:01:24",1238461,1,222
아니면 할 수 있습니다 ...
sed '/,.*,/s/[^,]*/"&"/2' <infile >outfile
이는 s///
대체를 조건부로 만듭니다. 여기서 사용된 대체는 단 하나의 쉼표와 일치하는 행에만 적용될 수 있기 때문입니다. 이 경우 해당 쉼표를 제외한 모든 항목을 인용합니다. 최소한 두 개의 쉼표와 일치하는 줄에만 대체가 적용되도록 하기 위해 /,.*,/
최소한 하나의 쉼표와 그 뒤에 *
.
모든 유형의 0개 이상의 문자와 최소한 하나의 쉼표가 일치하는 줄만 명시적으로 처리한 다음 해당 줄에서만 다음을 s///
사용합니다 . 2cd는 쉼표 [^,]*
가 아닌 0개 이상을 대체하기 위해 일치하며 *
, 그 자체는 따옴표로 묶입니다 &
."
줄의 첫 번째 문자가 쉼표인 경우에도 여전히 올바른 필드를 가져옵니다. 예:
sed '/,.*,/s/[^,]*/"&"/2' <<\IN
,2014-05-05 10:01:24,1238461,1,222
IN
...인쇄...
,"2014-05-05 10:01:24",1238461,1,222
...0개 이상의 쉼표가 아닌 문자의 첫 번째 일치는 첫 번째 쉼표 앞에 나타나는 길이가 0인 문자열이기 때문입니다.
답변4
방법 은 다음과 같습니다 sed
.
$ sed -n 's/\(\([0-9]\|-\)* \([0-9]\|:\)*\)/\"\1\"/p' file.txt
4,"2014-05-08 18:22:24",14718202,4,184
4,"2014-05-09 22:07:11",1278184,4,221
3,"2014-05-05 10:01:24",1238461,1,222
이것은 또한 작동합니다:
sed -n 's/\(.* \([0-9]\|:\)*\)/\"\1\"/p' file.txt