![](/img/trans.png)
[英]Multi-line regex should match multiple times in a file (one-line command if possible)
[英]Break a one-line file to a multi-line file, each line with the same number of words?
例如,单行文件line.txt
具有以下行:
741 12 3 24 45 123 32 111 34
假设每个单词的字数为3
。 那么目标是:
741 12 3
24 45 123
32 111 34
在这种情况下,哪些脚本可以提供帮助,不胜感激。
这对于awk来说将是一件容易的事。 我也看到了vim
的问题,然后用vim
尝试了一下。
假设光标在该行的开头。 你可以尝试(在键入NORMAL
模式):
100@='3f r^M'
然后输入Enter
。
宏也可以由qn3f r<Enter>q
记录,那么您只需100@n
注意
<CV><Enter>
的^M
cat your_file | tr " " "\n" | paste -s -d " \n"
尝试这个
printf "%s %s %s\n" $(cat line.txt)
它产生
741 12 3
24 45 123
32 111 34
这是使用sed的方法。 将单词数固定为3
,您可以执行以下操作:
sed 's/\( [^ ]* [^ ]*\) /\1\n/g' <filename>
如果要动态指定单词数,可以使用以下脚本动态创建正则表达式:
#!/bin/sh
test $# -eq 2 || (echo "Usage: $(basename "${0}") <filename> <#words>" && exit 1)
for i in $(seq 2 "${2}"); do
REGEX=" [^ ]*${REGEX}"
done
cat "${1}" | sed "s/\\(${REGEX}\\) /\\1\n/g"
一种使用awk
:
awk '{
for ( i = 1; i <= NF; i++ ) {
printf "%s%s", $i, (i % 3 == 0) ? "\n" : " "
}
}' line.txt
它产生:
741 12 3
24 45 123
32 111 34
编辑以修复脚本(请参见注释),用于多个字段(不是3的倍数):
awk '
{
for ( i = 1; i <= NF; i++ ) {
printf "%s%s", $i, (i < NF && i % 3 == 0) ? "\n" : " "
}
}
END { printf "\n" }
' infile
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.