Bash
使用帶有兩個不同分隔符的 cut/awk/sed
我有以下情況:
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 in
perl
允許您在匹配的正則表達式模式中包含字元串,而不會將它們包含在將對正則表達式執行的操作中。將它們視為插入符號 (^
) - 行首和美元 ($
) - 行尾的動態版本。這一點不那麼hacky,然後@
在刪除它之後必須重新添加。