sed를 사용하여 파일 조작

sed를 사용하여 파일 조작

students.txt다음 형식의 데이터가 포함된 파일이 있습니다 Surname, Forename: day.month.year: Degree.

Smith, John: 15.01.1986: MSc IT 
Taylor, Susan: 04.05.1987: MSc IT 
Thomas, Steve: 19.04.1986: MSc MIT 
Sennick, Joseph: 01.12.1987: MSc IT 

모든 행을 형식으로 반환하려고 Forename,Surname: day.month.year하지만 MSc연구 중인 학위는 반환하지 않습니다. 지금까지 나는 다음을 가지고 있습니다 :

sed -e 's/\(.*\),(.*\)/\2/\1/' students.txt

이게 무슨 문제야?

답변1

다음 솔루션은 보편적이지 않지만 데이터 형식이 동일하게 유지되면 작동합니다.

sed -r 's/^([A-Za-z]+), ([A-Za-z]+): (([0-9]{2}\.){2}[0-9]{4}): .*$/\2,\1: \3/' students.txt

답변2

이렇게 하면 트릭을 수행할 수 있습니다.

sed -e 's/\([^,:]*\), *\([^:]*\)/\2, \1/;s/:[^:]*$//' student.txt

첫 번째 문( 로 구분 ;)은 쉼표 공백으로 구분된 성과 콜론으로 구분된 이름을 검색하고 쉼표 공백 구분 기호를 사용하여 이를 바꿉니다. 두 번째 문은 마지막 콜론을 검색하여 콜론과 줄 끝의 모든 항목을 제거합니다. 누군가 언급했듯이 이것은 awk로 처리할 수 있습니다.

awk -F: 'BEGIN{OFS=":"}{split($1,N,", ");$1=N[2]", "N[1];NF=2;print}' student.txt

양자전기역학

답변3

sed세 개의 역참조가 필요하기 때문입니다 . 첫 번째는 쉼표로 구분되고 마지막 두 개는 콜론으로 구분됩니다.

sed 's/^\([^,]*\), \([^:]*\): \([^:]*\).*$/\2, \1: \3/' students.txt

awk그러나 이는 정규 표현식이 될 수 있는 필드 구분 기호를 지정할 수 있으므로 구분 기호와 필드를 처리할 때 실제로 사용하는 도구입니다 . 이 경우 필드 구분 기호는 쉼표 또는 콜론이고 그 뒤에 공백이 옵니다.

 awk -F'[,:] ' '{printf("%s, %s: %s\n",$2,$1,$3)}' students.txt

답변4

sed에 비해 awk를 ":" 필드 구분 기호와 함께 사용하고 처음 두 필드만 인쇄하는 것이 더 쉬울 수 있습니다.

관련 정보