我有一个包含以下条目的文件
vdomain
v2host
v3server
v1adapter
vhost
v2domain
v1application
我想将所有这些条目分成 4 个不同的文件,例如
file1 :应包含以“v”开头的名称
vdomain
vhost
file2 :应包含以“v1”开头的名称
v1application
v1adapter
file3 :应包含以“v2”开头的名称
v2host
v2domain
file4 :应包含以“V3”开头的名称
v3server
答案1
使用awk
:
awk '/^v[^123]/ { print >"file1" }
/^v1/ { print >"file2" }
/^v2/ { print >"file3" }
/^v3/ { print >"file4" }' inputfile
这将创建您的四个文件。
第一个正则表达式仅匹配以 a 开头且v
后面不跟数字 1、2 或 3 的行(因为这些行将进入其他文件)。与任何正则表达式不匹配的行将被丢弃。
与以下内容等效sed
:
sed -n \
-e '/^v[^123]/w file1' \
-e '/^v1/w file2' \
-e '/^v2/w file3' \
-e '/^v3/w file4' inputfile
命令w
将sed
当前行写入指定文件。
并使用 shell 循环(你不真的想用这个):
rm -f file[1234]
while read -r words; do
case "$words" in
v1*) printf '%s\n' "$words" >>file2 ;;
v2*) printf '%s\n' "$words" >>file3 ;;
v3*) printf '%s\n' "$words" >>file4 ;;
v*) printf '%s\n' "$words" >>file1 ;;
esac
done <inputfile
这是几乎除了每个输入行后面的空格将被删除之外,其他相同,并且初始空格也将被忽略并删除。在这里,测试的顺序也很重要。
最后, with ed
,其脚本与 with 所使用的脚本毫无疑问相同sed
:
cat <<ED_END | ed -s inputfile
/^v[^123]/w file1
/^v1/w file2
/^v2/w file3
/^v3/w file4
ED_END