Unix bash/ksh:从特定行的文件中选择第一个非空格字符

Ama*_*man 1 shell bash ksh shell-script

我有文件,file1.txt其内容如下:

Date List
-----------
    Quarter Date
         Year Date
             Month Date
Run Code Online (Sandbox Code Playgroud)

现在我想从文件的每一行读取非空格元素并写入一个变量。例如,第 2 行变量应Quarter Year仅在删除空格后才包含。

我试过:

tail -1 file1.txt > variable1
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

kos*_*kos 7

使用sed

variable1="$(< inputfile sed -n '3s/ *//p')"
Run Code Online (Sandbox Code Playgroud)
  • variable1="$([...])":[...]在子shell中运行命令并将其输出分配给变量$variable
  • < inputfile:重定向的内容inputfilesedstdin
  • -n: 抑制输出

sed命令分解

  • 3:断言仅在输入的第 3 行执行以下命令
  • s: 断言执行替换
  • /: 开始搜索模式
  • *: 匹配零个或多个字符
  • /: 停止搜索模式/开始替换字符串
  • /: 停止替换字符串(因此实际上什么都不替换)/启动修饰符
  • p: 只打印替换成功的行


cha*_*aos 5

首先将所需的行读入变量(示例中的第 3 行):

var=$(sed -n '3p' file1.txt)
Run Code Online (Sandbox Code Playgroud)

sed 命令打印 ( p) 文件的第三行。使用参数替换去除前导空格:

echo "${var#"${var%%[![:space:]]*}"}"
Run Code Online (Sandbox Code Playgroud)

内部替换意味着删除除前导空格之外的所有内容。外部替换删除了行首的那些空格。

输出是:

Quarter Date
Run Code Online (Sandbox Code Playgroud)