如何在第80个字符后的模式(包括它)之后定位部分行?

时间:2011-02-28 23:08:46

标签: bash

我知道这个问题听起来有些奇怪,但我会尝试解释一下。

我有一个文件params,如下所示:

3       p       1 1.732051 0 1.9628$/x2r_a/  
4       p       1 1.732051 0 -1.9628$/x2r_a/  
5       p       -1 1.732051 0 1.9628$/x2r_a/  
6       p       -1 1.732051 0 -1.9628$/x2r_a/  

我想要实现的是将$之后的所有内容移动到右边,即第80行的“第一位”:

3       p       1 1.732051 0 1.9628                                   $/x2r_a/  
4       p       1 1.732051 0 -1.9628                                  $/x2r_a/  
5       p       -1 1.732051 0 1.9628                                  $/x2r_a/  
6       p       -1 1.732051 0 -1.9628                                 $/x2r_a/

我们不知道$符号前字符串的确切长度。它们之间的空间也必须用空格填充,仅此而已。

一如既往,我需要在bash 2.05中使用sed,awk或者类似的东西。

UPDATE
我没有具体说明文件是什么样的,所以更多:

c ------------------
c Something stupid
c ------------------
c there is a number: 9$/ar_numb/
c a line that looks
1       px      0.9814$/r_a/
2       px      -0.9814$/r_a/
3       p       1 1.732051 0 1.9628$/x2r_a/
4       p       1 1.732051 0 -1.9628$/x2r_a/
5       p       -1 1.732051 0 1.9628$/x2r_a/
6       p       -1 1.732051 0 -1.9628$/x2r_a/
c
c dirty line
7       cz      0.9347$/x05d_a/
c very dirty
41      p       0$/A_Nel/!jl
        1$/B_Nel/!jl
        0$/C_Nel/!jl
        0$/D_Nel/!jl
        $bad element
42      p       1.723051$/A_NEel/!jl
        1$/B_NEel/!jl
        0$/C_NEel/!jl
        0$/D_NEel/!jl
        $kokode nanika kaite kudasai

我不会发布更改版本因为它太长了。我希望将$[string]部分移到右侧,但没有$的部分将保持不变。

3 个答案:

答案 0 :(得分:1)

基于kojiro的答案,包括新要求

awk -F'$' '/\$/{printf("%-79s$%s\n", $1, $2);next}1' ./params

概念证明

$ awk -F'$' '/\$/{printf("%-79s$%s\n", $1, $2);next}1' ./params
c ------------------
c Something stupid
c ------------------
c there is a number: 9                                                         $/ar_numb/
c a line that looks
1       px      0.9814                                                         $/r_a/
2       px      -0.9814                                                        $/r_a/
3       p       1 1.732051 0 1.9628                                            $/x2r_a/
4       p       1 1.732051 0 -1.9628                                           $/x2r_a/
5       p       -1 1.732051 0 1.9628                                           $/x2r_a/
6       p       -1 1.732051 0 -1.9628                                          $/x2r_a/
c
c dirty line
7       cz      0.9347                                                         $/x05d_a/
c very dirty
41      p       0                                                              $/A_Nel/!jl
        1                                                                      $/B_Nel/!jl
        0                                                                      $/C_Nel/!jl
        0                                                                      $/D_Nel/!jl
                                                                               $bad element
42      p       1.723051                                                       $/A_NEel/!jl
        1                                                                      $/B_NEel/!jl
        0                                                                      $/C_NEel/!jl
        0                                                                      $/D_NEel/!jl
                                                                               $kokode nanika kaite kudasai

答案 1 :(得分:1)

awk -F'$' '{ printf("%-80s$%s\n", $1, $2) }' params

答案 2 :(得分:0)

这可能对您有用:

# sed '\|\(.*\)\($/.*\)|{h;x;s//\2/;x;s//\1/;:a;s/^.\{1,78\}$/ &/;ta;s/^\( *\)\(.*\)/\2\1/;G;s/\n//}' params
c ------------------
c Something stupid
c ------------------
c there is a number: 9                                                         $/ar_numb/
c a line that looks
1       px      0.9814                                                         $/r_a/
2       px      -0.9814                                                        $/r_a/
3       p       1 1.732051 0 1.9628                                            $/x2r_a/
4       p       1 1.732051 0 -1.9628                                           $/x2r_a/
5       p       -1 1.732051 0 1.9628                                           $/x2r_a/
6       p       -1 1.732051 0 -1.9628                                          $/x2r_a/
c
c dirty line
7       cz      0.9347                                                         $/x05d_a/
c very dirty
41      p       0                                                              $/A_Nel/!jl
1                                                                              $/B_Nel/!jl
0                                                                              $/C_Nel/!jl
0                                                                              $/D_Nel/!jl
        $bad element
42      p       1.723051                                                       $/A_NEel/!jl
1                                                                              $/B_NEel/!jl
0                                                                              $/C_NEel/!jl
0                                                                              $/D_NEel/!jl
        $kokode nanika kaite kudasai
# printf "%.1s" {1..90}
123456789111111111122222222223333333333444444444455555555556666666666777777777788888888889# 

说明:

  1. 仅修改包含$/...
  2. 的行
  3. 将该行复制到保留空间(HS)。
  4. 切换到HS并删除除字符串$/....
  5. 之外的所有内容
  6. 交换回模式空间(PS)并执行相反操作,即删除$/...
  7. 使用空格缩进PS到第79列
  8. 用非空格交换PS前面的空格。
  9. 将HS附加到PS,即将$/...字符串添加到该行的末尾。
  10. 删除G命令导致的嵌入式换行符。
  11. 可替换地:

    sed '\|\(.*\)\($/.*\)|!{s/.*/printf "%s\n" "&"/;b};s//printf "%-79s%s\n" "\1" "\2"/' params | sh
    

    或者使用GNU sed:

    sed '\|\(.*\)\($/.*\)|{s//printf "%-79s%s" "\1" "\2"/e}' params