shell中for改用换行符作为分割符

shell中for改用换行符作为分割符

参考: https://blog.csdn.net/whatday/article/details/122508281

参考: https://stackoverflow.com/questions/13925879/what-does-n-mean-in-bash

参考: https://www.xiaomastack.com/2014/10/31/shell-iterator/

BASH中用IFS定制分隔符

目前来看, 适用bash: IFS是internal field separator的缩写,shell的特殊环境变量。ksh根据IFS存储的值,可以是空格、tab、换行符或者其他自定义符号,来解析输入和输出的变量值。

用IFS定制分隔符的方式范例

IFS='|'
text='a a a a|b b b b|c c c c'
for i in $text;do echo "i=$i";done

使用换行符做分隔符

IFS=$'\n'
#!/bin/sh
 
conf="ABC
A B C
1|2|3
1 2 3"
echo "$conf"
 
echo --------------
echo IFS:
echo -n "$IFS"|xxd 
echo --------------
for c in $conf;do
    echo "line='$c'";
done
 
echo --------------
#IFS=$'\n'  表示用 换行符 做分隔
#IFS="\n" 与 IFS='\n'  都是用 n 字符作为分隔
IFS=$'\n'
echo IFS:
echo -n "$IFS"|xxd 
echo --------------
for c in $conf;do
    echo "line='$c'";
done

输出:

ABC
A B C
1|2|3
1 2 3
--------------
IFS:
00000000: 2d6e 2020 090a 0a                        -n  ...
--------------
line='ABC'
line='A'
line='B'
line='C'
line='1|2|3'
line='1'
line='2'
line='3'
--------------
IFS:
00000000: 2d6e 200a 0a                             -n ..
--------------
line='ABC'
line='A B C'
line='1|2|3'
line='1 2 3'

借助awk

在 shell 脚本中,如果你想要使用换行符作为分隔符来处理文本,你可以使用各种工具,如 awksedperlpython 等。但是,直接在 shell 的 for 循环中使用换行符作为分隔符并不直接支持,因为 for 循环通常用于遍历由空格、制表符或换行符分隔的列表(对于 for i in $(...)),但它不会以换行符作为字段分隔符。

不过,你可以通过一些方法间接地实现这个需求。以下是一个使用 awk 的例子,它可以将输入中的每一行作为一个单独的项来处理:

awk '{for(i=1; i<=NF; i++) print $i}' input.txt | while read line; do  
    echo "Processing: $line"  
done

但上面的例子实际上并没有使用换行符作为分隔符,因为 awk 默认就是按行处理的。

如果你有一个由换行符分隔的字符串,并且你想要在 shell 脚本中遍历这个字符串中的每一行,你可以直接使用 while read 循环:

string="line1\nline2\nline3"  
echo -e "$string" | while read line; do  
    echo "Processing: $line"  
done

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注