可以用sed只反转文件中所有行的前n个字符吗?

时间:2018-03-09 05:13:28

标签: sed

例如......

this is a line 2345
this is a line 1234

sed可以反转这些行(数字长度相同但文件中的行长度不同):

5432 enil a si siht
4321 enil a si siht

现在可以仅反转(不提取)数字,以便可以对数字进行排序:

2345 enil a si siht
1234 enil a si siht

然后再次反转前n个字符:

4321 enil a si siht
5432 enil a si siht

然后整行,按不均匀行末尾的数字对整个文件进行排序:

this is a line 1234
this is a line 2345

因为我无法使用sed对文件末尾的数字进行排序。

3 个答案:

答案 0 :(得分:0)

在我对你的问题的解释中,你的行有不同数量的单词和最后的数字,你想要在最后对数字进行排序。如果是这样,请考虑以下示例文件:

$ cat File
this is a line 231
Another 312
a longer long with many words 123

要使用sed以数字方式对其进行排序,请尝试:

$ sed -E 's/.* ([[:digit:]]+)$/\1 &/' File | sort -n | sed 's/^[[:digit:]]* //'
a longer long with many words 123
this is a line 231
Another 312

答案 1 :(得分:0)

鉴于您的文件不包含'#'字符。您可以在数字前面插入这样的字符,并将其指定为排序分隔符,对该值进行排序,然后再将其删除:

cat tosort.txt | sed -r 's/ ([0-9]+)$/ #\1/' | sort -t'#' -k2 -n | sed 's/#//'
3 a longer long with many words 123
1 this is a line 231
2 Another 312

如果您的文件包含#,则可以选择另一个魔术分隔符。 如果输入文件发生更改,您可以在不包含此类字符之前对其进行测试,更进一步,为此目的自动搜索有用的字符。

我不知道为什么John删除了他的答案,将数字移到前面,对文件进行排序,然后再将其移回。似乎是一个更好的解决方案。

或者你真的想用sed排序吗?

要只使用前4位数字,您可以使用类似的内容:

sed -r 's/([0-9])([0-9])([0-9])([0-9]) (.*)/\4\3\2\1 \5/' toresort.txt

对于给定的更大数字的数字,您可以部分或全部自动生成此类表达式。

rfec () { n=$1; echo -n $g;  if (( $n > 0 )) ; then  rfec $(( n - 1 )); fi ; x=$1; echo -n '\$'$((9-x)); }
rfec 9
([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])\$9\$8\$7\$6\$5\$4\$3\$2\$1\$0

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/^(.{0})(.{4})/\1\n\2\n/;T;:a;s/\n(.)(.*\n)/\n\2\1/;ta;s/\n//g' file

这将反转一行的前四个字符(假设该行至少有四个字符)。

sed -r 's/([0-9]+)/\n&\n/;T;:a;s/\n(.)(.*\n)/\n\2\1/;ta;s/\n//g' file

这将反转一行上的第一组数字(一个或多个)。

上述组合可用于反转部分或整行。