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

cut*_*eth 1 regex macos bash sed

我试图遍历目录中的每个文件和文件夹,并将文件名的一部分提取到一个变量中,但我无法使 sed 正常工作。我要么得到所有的文件名,要么没有。

此版本的脚本应捕获整个文件名:

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

但我什么也没得到:

sub:
sub:
sub:
sub:
...
Run Code Online (Sandbox Code Playgroud)

这个版本应该只给我文件名中的第一个字符:

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

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

sub: Adlm
sub: Applications
sub: Applications (Parallels)
sub: Desktop
...
Run Code Online (Sandbox Code Playgroud)

我已经尝试了无数次迭代,它基本上归结为如果我使用-n我什么也得不到,如果我不使用我得到整个文件名。

有人可以告诉我如何获得第一个字符吗?

或者,我的总体目标是能够提取一个子字符串并将其存储到一个变量中,如果有人有更好的方法,那也将不胜感激。

提前致谢。

koj*_*iro 5

如果要修改 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
Run Code Online (Sandbox Code Playgroud)

参数扩展不如 强大sed,但它们内置于 shell(无需启动单独的进程或子 shell),并且有以下扩展:

  1. 子串(如上)
  2. 替换和替换字符
  3. 改变字符串的大小写(bash 4+)

和更多。