Bash

使用帶有兩個不同分隔符的 cut/awk/sed

  • August 22, 2013

我有以下情況:

case@test.com
case_1_2@test.com
case_1@test.com

我正在嘗試將這些轉換為

case@test.com
case@test.com
case@test.com

所以它應該刪除從第一個’_’(包括它)到@(不包括那個)的所有內容。

我有一些東西,但它並不能正常工作:

基於此執行緒:Cut based on Two Delimiters at one go和此 U&L Q&A: Splitting string by the first occurrence of a delimiter

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

但沒有運氣。有人想听聽嗎?

假設你永遠不會有超過一個@符號,

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

…應該管用。

不知道你真的在做什麼,但你可以這樣做sed

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

這有效地修剪了case和 之間的所有內容@

你可以做類似的事情awk

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

也可以使用perl(類似於 evilsoup 的方法):

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

或者您可以使用perl’s 的前瞻功能

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

注意: Lookahead 和lookbehind’s inperl允許您在匹配的正則表達式模式中包含字元串,而不會將它們包含在將對正則表達式執行的操作中。將它們視為插入符號 ( ^) - 行首和美元 ( $) - 行尾的動態版本。這一點不那麼hacky,然後@在刪除它之後必須重新添加。

引用自:https://unix.stackexchange.com/questions/87529