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

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

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

Date List
-----------
    Quarter Date
         Year Date
             Month Date

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

我试过:

tail -1 file1.txt > variable1

但这不起作用。

答案1

使用sed

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

sed命令分解:

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

答案2

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

var=$(sed -n '3p' file1.txt)

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

echo "${var#"${var%%[![:space:]]*}"}"

内部替换意味着删除除前导空格之外的所有内容。外部替换删除行开头的空格。

输出是:

Quarter Date

答案3

tail -1 file1.txt > variable1写入文件variable1

使用命令替换(bash.info 3.5.4、POSIX sh)代替:

variable1="$(tail -1 file1.txt)"

顺便说一句,我的 cygwin 中的 GNU tail 版本没有这个-1选项。相反,我使用sed

# EREGEX: Replace all whitespace at beginning of line
# NOTE: BSD sed uses a different flag to enable EREGEX, -E.
# EDIT: Dropped -r. \s is already included in BRE.
#       Thanks to kos for pointing that out.
# EDIT: Use POSIX [:space:] instead of Perl \s.
variable1="$(sed -e 's/^[[:space:]]*//g' < file1.txt)"

结合线路选择:

# EDIT: limit the [s]ubstitude operation to the 4th line only, and
#       [p]rint directly from s.
variable1="$(sed -ne '4s/^[[:space:]]*//p' < file1.txt)"

答案4

ksh/ zsh/ bash

IFS=' ' read -r variable < <(tail -n 1 file)

read去除前导和尾随空格字符如果找到空格IFS(默认情况下与制表符和换行符一起)。

您还可以这样做:

while IFS=' ' read -r variable <&3; do
  something with "$variable"
done 3< file

逐行处理文件(虽然这通常不是使用 shell 的方法)并$variable保留当前行的内容,并删除前导和尾随空格字符。

相关内容