簡體   English   中英

用 SED 提取 substring

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM