다음과 같은 경우가 있습니다.
[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