텍스트 파일에서 특정 문자 제거

텍스트 파일에서 특정 문자 제거

텍스트 파일이 있습니다. 내용은 다음과 같습니다.

$ cat file.txt
[] [1]foo1 bar1
[] [2]foo2 bar2
[] [35]foo3 bar3
[] [445]foo4 bar4
[] [87898]foo5 bar5

awk를 사용하여 첫 번째 열을 성공적으로 제거할 수 있지만 문자열과 연결되어 있기 때문에 [num]자를 제거할 수 없습니다.

아래와 같은 출력을 얻으려고합니다.

$ cat file.txt
foo1 bar1 
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

답변1

$ sed 's/.*]//' file.txt | tr -s ' '
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

sed마지막 줄까지(및 포함) 줄의 모든 내용을 제거 ]하고 tr여러 연속 공백을 단일 공백으로 압축합니다.

또는 다음을 사용하십시오 sed.

sed -e 's/.*]//' -e 's/  */ /g' file.txt

주어진 입력 데이터를 사용하면 첫 번째 파이프라인과 동일한 출력이 생성됩니다.

sed이 작업을 먼저 수행하면 s/.*]//이전의 모든 항목이 삭제(포함)됩니다 ]. 두 번째 표현식은 ␣␣*공백 뒤에 0개 이상의 공백이 오는 것을 일치시키고 이를 단일 공백으로 바꿉니다. 두 번째 표현식은 전체 줄에 적용되며 동일한 효과를 갖습니다 tr -s ' '. 즉, 여러 연속 공백을 단일 공백으로 압축합니다.


사용 awk:

awk -F '[][:blank:]]*' '{ print $3,$4 }' file.txt

여기서는 공백이나 탭을 필드 구분 기호로 사용합니다 ](이 중 둘 이상이 두 열을 분리할 수 있으므로 *나중에 이를 사용합니다 [...]). 이러한 구분 기호를 사용하면 각 행의 필드 3과 4에서 필수 데이터를 사용할 수 있습니다.


마지막 두 열 사이의 일부 공백을 제거하기 위해 질문의 데이터를 편집한 후 다음 작업도 수행됩니다.

cut -d ']' -f 3 file.txt

아니면 그냥

sed 's/.*]//' file.txt

또는

awk -F ']' '{ print $3 }' file.txt

답변2

당신은 그것을 사용할 수 있습니다sed

$ sed -e 's/.*]//g' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

`awk를 사용할 수 있습니다.

$ awk -F'.*]' '{print $2}' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

답변3

awk를 사용하세요:

$ awk '{$2=substr($2,index($2,"]")+1);print $2,$3}' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

두 번째 인수는 첫 번째 발견된 인수를 $2사용하여 잘립니다 . 그런 다음 매개변수 2와 3이 인쇄됩니다.substr]

답변4

또 다른 awk 제안

awk '{gsub(/\[.+foo|\]/,"foo")}1' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

관련 정보