두 개의 서로 다른 구분 기호와 함께 cut/awk/sed 사용

두 개의 서로 다른 구분 기호와 함께 cut/awk/sed 사용

다음과 같은 경우가 있습니다.

 [email protected]
 [email protected]
 [email protected]

나는 이것을 다음으로 변환하려고합니다.

 [email protected]
 [email protected]
 [email protected]

따라서 첫 번째 "_"(포함)부터 @(제외)까지 모든 항목을 제거해야 합니다.

뭔가가 있지만 실제로 작동하지 않습니다.

이 스레드를 기반으로 :한 번에 두 개의 구분 기호를 기준으로 잘라내기, 그리고 이 U&L Q&A:구분 기호의 첫 번째 발생으로 문자열 분할.

sed 's/^.*_\([^ ]*\) .*\@\([^$]*\)$/\1 \2/' infile

하지만 행운은 없습니다. 벨을 울리고 싶은 사람이 있나요?

답변1

정확히 무엇을 하고 있는지는 모르지만 다음과 같이 할 수 있습니다 sed.

$ sed 's/\(case\).*\(@test.com\)/\1\2/' 87529.txt 
[email protected]
[email protected]
[email protected]

case이렇게 하면 와 사이의 모든 내용이 효과적으로 정리됩니다 @.

다음과 같이 할 수 있습니다 awk:

$ awk -F@ '{split($1,a,"_"); print a[1]"@"$2}' 87529.txt 

다음과 같은 방법으로도 수행할 수 있습니다 perl(evisoup의 방법과 유사).

$ perl -p -e 's/_.*@/@/g' 87529.txt 

아니면 당신은 사용할 수 있습니다perl미래지향적인 시설:

$ perl -p -e 's/_.*(?=@)//g' 87529.txt 

노트:Lookahead 및 Lookbehind를 사용하면 perl정규식에 대해 수행되는 작업에 문자열을 포함하지 않고 일치시킬 정규식 패턴에 문자열을 포함할 수 있습니다. 캐럿( ^) - 줄의 시작과 달러( $) - 줄의 끝의 동적 버전이라고 생각하세요. @삭제한 후 다시 추가하는 것보다 조금 덜 번거롭습니다.

답변2

하나 이상의 기호가 없다고 가정하면 @,

sed 's/_.*@/@/' file.txt

...작동해야 합니다.

답변3

쉘이 매개변수 확장을 지원하는 경우 다음을 수행할 수 있습니다.

while read line; do
    printf "%s\n" "${line%%_*}@${line#*@}"
done < your_file_here

확장하면 ${line%%_*}가장 왼쪽 콘텐츠 _와 그 뒤의 모든 내용이 제거되고, 확장하면 ${line#*@}가장 왼쪽 콘텐츠 @와 그 앞의 모든 내용이 제거됩니다.

답변4

사악한 수프 해결책완벽한 것 같아요!

또 다른 솔루션은 sed및 를 모두 사용합니다 awk.

sed 's/_/ /g; s/@/ /g' file_name | awk '{ print $1"@"$NF '}

이는 효율성 측면에서 전적으로 중요하지는 않지만 정규식을 엉망으로 만들고 싶지 않은 경우 이해하기 쉬울 수도 있습니다. 위의 코드는 다음을 수행합니다.

  • 첫 번째 패턴은 sed"_"를 공백으로 바꿉니다.
  • 두 번째 패턴은 sed"@"를 공백으로 바꿉니다. 이제 파일 내용을 열로 분할합니다.

케이스 test.com
케이스 1_2 test.com
케이스 1 test.com

  • 마지막으로 awk내용을 구분하는 첫 번째 열과 마지막 열을 인쇄하면 됩니다. 여기에는 행의 필드 수를 나타내는 NF특수 기호가 있습니다 .awk

관련 정보