패턴 일치 후 라인 편집

패턴 일치 후 라인 편집

다음과 같은 텍스트가 있다고 가정해 보겠습니다.

file.txt 4 minutes 11 seconds 102 msec
file_1.txt 5 minutes 10 seconds 100 msec
file_3_2.txt 0 minutes 10 seconds 100 msec

을 사용하여 숫자와 파일 이름을 유지하면서 모든 단어를 제거하는 방법은 무엇입니까 sed?

file.txt 4 11 102
file_1.txt 5 10 100
file_3_2.txt 0 10 100

답변1

필요한 데이터를 추출하는 방법에는 여러 가지가 있습니다.

각 행을 공백으로 구분된 여러 필드로 처리하는 경우 문제를 해결하는 데 사용할 수 있는 가장 기본적인 도구는 다음과 같습니다 cut.

$ cut -d ' ' -f 1,2,4,6 file
file.txt 4 11 102
file_1.txt 5 10 100
file_3_2.txt 0 10 100

이렇게 하면 파일에서 공백으로 구분된 첫 번째, 두 번째, 네 번째 및 여섯 번째 필드가 추출됩니다.

마찬가지로 awk:

$ awk '{ print $1,$2,$4,$6 }' file
file.txt 4 11 102
file_1.txt 5 10 100
file_3_2.txt 0 10 100

이는 동일한 작업을 수행하지만 훨씬 더 많은 콘텐츠를 포함합니다. 도구 awk는 입력을 스트림으로 처리합니다.기록으로 구성되다필드. 기본적으로 레코드는 한 줄에 불과하며 필드는 공백(공백 또는 탭, 여러 개 가능)으로 구분된 공백이 아닌 텍스트입니다. 필드를 공백으로 구분하여 한 번에 하나의 레코드(기본적으로 한 번에 한 줄) 출력을 생성합니다.


약간 더 복잡한 방법은 나머지 데이터에서 첫 번째 필드를 잘라내고 나머지 데이터에서 문자를 모두 제거한 다음 두 필드를 다시 붙여넣는 것입니다.

$ paste -d ' ' \
    <( cut -d ' ' -f 1  file ) \
    <( cut -d ' ' -f 2- file | tr -s '[:alpha:]' '[ *]' )
file.txt 4 11 102
file_1.txt 5 10 100
file_3_2.txt 0 10 100

그러나 이는 입력을 두 번 읽기 때문에 약간 우아하지 않습니다. 사용된 명령은 tr모든 알파벳 문자를 공백으로 변경한 다음 -s여러 연속 공백 집합을 단일 공백으로 "압착"(사용)합니다.

paste명령은 두 개의 입력 스트림을 가져와 그 사이에 공백 문자를 넣어 한 줄씩 연결합니다. 첫 번째 스트림은 데이터에서 첫 번째 열만 추출하는 명령을 <( ... )실행하는 cut프로세스 대체( )에 의해 제공 됩니다. 두 번째 스트림은 cut열 2의 모든 열을 추출하기 위해 실행된 다음 tr앞서 설명한 대로 해당 열의 알파벳 문자를 공백으로 바꾸는 또 다른 프로세스 대체에 의해 제공됩니다.

답변2

귀하의 예가 귀하의 문제에 얼마나 구체적인지 명확하지 않습니다. 이것이 실제로 당신이 요구하는 것이라고 가정하면(이것이 수업 연습이 될 수 있다는 것을 걱정하게 만듭니다) 제거할 알려진 문자열이 3개만 있고 최종 기호가 생성되기를 원한다는 사실을 활용할 수 있습니다. 그들 사이에 단 하나의 공백이 있습니다. 매우 짧은 sed 명령입니다. 이 예제에서는 MacOS와 함께 제공되는 BSD sed를 사용하며, input.txt 파일의 입력과 stdout의 출력이 사용됩니다.

sed -E -e 's/ (minutes|seconds|msec)//g' < input.txt

이는 단일 공백 ​​뒤에 대상 문자열 중 하나가 오는 것과 일치한 다음 아무것도 없는 것으로 바꿉니다. 끝의 "g"는 동일한 라인에 반복 적용됨을 나타냅니다.

답변3

다음 GNU sed 명령을 사용하여 문제를 해결할 수 있습니다.

$ sed -Ee ' /(\s+\S+)\s+\S+/\1/g' file

우리는 계속해서 공백 단어를 번갈아 사용하고 다음 공백 단어 조합을 거부합니다.

답변4

한 가지 해결책은 "공백"과 "숫자가 아닌 단어"를 모두 제거하는 것입니다.

$ sed -E 's/ \<[^0-9]*\>//g' file
file.txt 4 11 102
file_1.txt 5 10 100
file_3_2.txt 0 10 100

관련 정보