簡體   English   中英

在Linux和AIX上使用正則表達式替換bash腳本中的字符串

[英]Replace a string in bash script using regex for both linux and AIX

我有一個bash腳本,可以在Linux和AIX服務器上復制並運行。
該腳本獲取代表文件名的“名稱”參數,我需要通過正則表達式來操縱該名稱(目的無關緊要,很難解釋)。
從name參數開始,我需要從頭開始直到第一個“-”字符后跟一個數字,然后將其與最后一個“。”連接起來。 字符,直到字符串末尾。

例如:

name: abcd-efg-1.23.4567-8.jar will become: abcd-efg.jar
name: abc123-abc3.jar          will remain: abc123-abc3.jar
name: abc-890.jar              will become: abc.jar

我嘗試了以下幾種變體:

name=$1
regExpr="^(.*?)-\d.*\.(.*?)$/g"
echo $name 
echo $(printf ${name} | sed -e $regExpr)

我也不能使用sed -r (在某些示例中看到),因為AIX sed不支持-r標志。

最后一行當然是問題。 我想我需要以某種方式使用$ 1 + $ 2占位符,但是我似乎無法正確地做到這一點。

我該如何更改我的正則表達式,使其滿足我的要求?

給定文件:

abcd-efg-1.23.4567-8.jar
abc123-abc3.jar
abc-890.jar

這是一種更改您提供的名稱的方法:

$ sed 's/\(.\?\)-[0-9].*\(\.[a-z]*\)$/\1\2/' file
abcd-efg.jar
abc123-abc3.jar
abc.jar

等效於(如果可以使用-r ):

$ sed -r 's/(.?)-[0-9].*(\.[a-z]*)$/\1\2/' file
abcd-efg.jar
abc123-abc3.jar
abc.jar
  • 它使所有內容最多為- + digit並在\\1 “存儲”。
  • 它從最后開始. + \\2 letters和“存儲”。
  • 最后,它將這些塊打印回來。

請注意,擴展名也可以使用內置的basename或類似於““ $ {line ## *。}”的basename來獲取。

在sed中,您可以簡單地使用以下內容。

#!/bin/sh
STRING=$( cat <<EOF
abcd-efg-1.23.4567-8.jar
abc123-abc3.jar
abc-890.jar
EOF
)
echo "$STRING" | sed 's/-[0-9].*\(\.[^.]\+\)$/\1/'
# abcd-efg.jar
# abc123-abc3.jar
# abc.jar

這匹配連字符,后跟數字,后跟數字,並以文件擴展名代替。

或者,您可以考慮使用Perl單線:

echo "$STRING" | perl -pe 's/-\d.*(?=\.[^.]+$)//'
# abcd-efg.jar
# abc123-abc3.jar
# abc.jar

您可以使用此:

perl -F'(-(?:\d)|\.)' -ane 'print "$F[0].$F[$#F]"'

它將輸入拆分為任意-后跟一個數字或任意. 然后,它打印第一個字段,后跟一個點,最后一個字段。

測試一下:

$ cat file
abcd-efg-1.23.4567-8.jar
abc123-abc3.jar
abc-890.jar
$ perl -F'(-(?:\d)|\.)' -ane 'print "$F[0].$F[$#F]"' file
abcd-efg.jar
abc123-abc3.jar
abc.jar

當成功進行正則表達式匹配時,perl會將括號(..)中匹配的內容捕獲為$ 1,$ 2等。

$ perl -e 'my $arg = $ARGV[0]; $arg =~ /^(.*?)-\d.*\.(.*?)$/; print "$1.$2\n"; ' abc-890.jar
abc.jar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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