簡體   English   中英

如何在OS X上使用sed提取子字符串?

[英]How to extract a substring using sed on OS X?

我試圖遍歷目錄中的每個文件和文件夾並將部分文件名提取到一個變量中,但是我無法使sed正常工作。 我要么獲得所有文件名,要么都沒有。

此版本的腳本應捕獲整個文件名:

#!/bin/bash
for f in *
do
    substring=`echo $f | sed -E -n 's/(.*)/\1/'`
    echo "sub: $substring"
done

但是相反,我什么也沒得到:

sub:
sub:
sub:
sub:
...

這個版本應該只給我文件名中的第一個字符:

#!/bin/bash
for f in *
do
    substring=`echo $f | sed -E 's/^([a-zA-Z])/\1/'`
    echo "sub: $substring"
done

但是我得到了整個文件名:

sub: Adlm
sub: Applications
sub: Applications (Parallels)
sub: Desktop
...

我已經嘗試了無數次迭代,基本上可以歸結為,如果我使用-n我什么也不會得到,如果我沒有,我將得到整個文件名。

有人可以教我如何獲得第一個角色嗎?

或者,我的總體目標是能夠提取子字符串並將其存儲到變量中(如果有人對此有更好的處理方法),也將不勝感激。

提前致謝。

如果要修改shell參數,則可能要使用參數擴展。

for f in *; do
    # This version should expand to the whole parameter
    echo "$f"
    # This version should expand to the first character in the filename
    echo "${f::1}"
done

參數擴展的功能不如sed強大,但它們內置於外殼中(無需啟動單獨的進程或子外殼),並且具有以下擴展:

  1. 子串(如上所述)
  2. 替換和替換字符
  3. 改變字符串的大小寫(bash 4+)

和更多。

您忘記在sed捕獲組之后添加.*

$ for i in *; do substring=`echo $i | sed -E 's/^(.).*$/\1/'`; echo "sub: $substring"; done

最好使用. 而不是[a-zA-Z]因為如果第一個字符以任何特殊字符開頭可能會失敗。

我更喜歡awk來做愛。 對我來說似乎更容易理解。

#!/bin/bash
#set -x
for f in *
do
  substring=`echo $f | awk '{print substr($1,1,1)}'`
  echo "sub: $substring"
done

此版本的腳本應捕獲整個文件名:

sed -E -n's /(。*)/ \\ 1 /'

但是我什么也沒得到。

您使用了-n因此自然不會產生任何結果。 也許您應該刪除-n或添加p

sed -E -n 's/(.*)/\1/p'

這個版本應該只給我文件名中的第一個字符:

sed -E's / ^([a-zA-Z])/ \\ 1 /'

但是我得到了整個文件名,

您在那里沒有替換任何東西。 也許您想要的是

sed -E 's/^([a-zA-Z]).*/\1/'

我也建議您很好地引用您的論點:

substring=`echo "$f" | sed ...'`

最后,如果您按照kojiro的建議使用Bash, 則更簡單的方法是使用子字符串擴展。

暫無
暫無

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

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