[英]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
強大,但它們內置於外殼中(無需啟動單獨的進程或子外殼),並且具有以下擴展:
和更多。
您忘記在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 ...'`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.