[英]extract substring with SED
我有下一個字符串:例如:
input1 = abc-def-ghi-jkl
input2 = mno-pqr-stu-vwy
我想提取“-”之間的第一個詞
對於我想獲得的第一個字符串: def
如果輸入是第二個字符串,我想得到: pqr
我想使用命令 SED ,你能幫幫我嗎?
利用
sed 's,^[^-]*-\([^-]*\).*,\1,' file
第一個-
之后的字符串將被捕獲到第二個-
並且 rest 將被匹配,然后匹配的行將替換為組文本。
使用bash
:
var='input1 = abc-def-ghi-jkl'
var=${var#*-} # remove shortest prefix `*-`, this removes `input1 = abc-`
echo "${var%%-*}" # remove longest suffix `-*`, this removes `-ghi-jkl`
或使用awk
:
awk -F'-' '{print $2}' <<<'input1 = abc-def-ghi-jkl'
使用-
作為輸入字段分隔符並打印第二個字段。
或使用cut
:
cut -d'-' -f2 <<<'input1 = abc-def-ghi-jkl'
當您想使用sed
時,您可以選擇以下解決方案
# Double processing
echo "$input1" | sed 's/[^-]*-//;s/-.*//'
# Normal approach
echo "$input1" | sed -r 's/^[^-]*-([^-]*)|-.*)/\1/g'
# Funny alternative
echo "$input1" | sed -r 's/(^[^-]*-|-.*)//g'
明顯的“外部”工具將被cut
。 您還可以查看 Bash 內置解決方案,例如
[[ ${input1} =~ ([^-]*)-([^-]*) ]] && printf %s "${BASH_REMATCH[2]}"
grep
解決方案(在我看來,這是最自然的方法,因為您只是想找到與正則表達式的匹配項 - 您不想編輯任何內容,因此不需要更高級的命令sed
)
grep -oP '^[^-]*-\K[^-]*(?=-)' << EOF
> abc-qrs-bobo-the-clown
> 123-45-6789
> blah-blah-blah
> no dashes here
> mahi-mahi
> EOF
Output
qrs
45
blah
解釋
首先查看輸入,這里包含的完整性是一個heredoc (您更有可能將您的文件命名為grep
的最后一個參數。)該解決方案要求字符串中至少存在兩個破折號; 特別是對於mahi-mahi
,它將找不到匹配項。 如果您想找到第二個mahi
作為匹配項,您可以刪除正則表達式末尾的前瞻斷言(見下文)。
正則表達式就是這樣做的。 首先注意命令選項: -o
只返回匹配的 substring,而不是整行; 和-P
使用 Perl 擴展。 然后,正則表達式:從行首開始( ^
); 查找零個或多個非破折號字符,后跟破折號,然后 ( \K
) 從找到的與模式匹配的子字符串中丟棄所需匹配的這部分。 然后再次查找零個或多個非破折號字符 - 這將由命令返回。 最后,要求在此模式后使用破折號,但不要將其包含在匹配項中。 這是通過前瞻(由(?=... )
標記)完成的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.