텍스트 파일이 있습니다. 내용은 다음과 같습니다.
$ 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