我有一个文件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
: 将内容重定向inputfile
到sed
'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
保留当前行的内容,并删除前导和尾随空格字符。