sed, 앞뒤에 찾기 및 배치

sed, 앞뒤에 찾기 및 배치

날짜와 시간이 다른 텍스트가 너무 많아서 패턴으로 사용할 수 없는데, 첫 번째 ,와 인쇄 후 ", 두 번째 ,와 인쇄 전을 검색할 수 있는지 궁금합니다 ". 다음과 같아야 합니다.

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

관련 정보