Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 第80个字符后的图案(包括图案)后的线条部分如何定位?_Bash - Fatal编程技术网

Bash 第80个字符后的图案(包括图案)后的线条部分如何定位?

Bash 第80个字符后的图案(包括图案)后的线条部分如何定位?,bash,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/ 我想要实现的是将($之后的所有内

我知道这个问题听起来有点奇怪,但我会尝试解释得更多

我有一个文件
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/
我们不知道
$
符号前字符串的确切长度。此外,之间的空间必须用空格填充,仅此而已

像往常一样,我需要在Bash2.05中使用sed、awk或类似的东西来实现它

更新
我没有具体说明文件的外观,所以这里有更多内容:

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]
部分移到右边,但是那些没有
$
东西的行将保持原样。

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

概念证明
awk-F'$'{printf(“%80s$%s\n”,$1,$2)}参数

这可能适用于您:

# 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# 
说明:

  • 仅编辑包含
    $/…
  • 将该行复制到保留空间(HS)
  • 交换到HS并删除除字符串以外的所有内容
  • 交换回模式空间(PS)并执行相反的操作,即删除
    $/…
  • 用空格将PS缩进第79列
  • 将PS前面的空格与非空格交换
  • 将HS附加到PS,即将
    $/…
    字符串添加到行的末尾
  • 删除由
    G
    命令引起的嵌入换行符
  • 或者:

    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
    

    另外,我还尝试了
    列(1)
    作为解决方案。我无法获得确切的要求,但是
    列-ts'$”参数
    非常出色地打印了您输入的任意术语宽度。@SiegeX:它非常适合
    $
    的行,但它也在不应该的行中添加了$。@SiegeX:请查看更新。我添加了一些行,因为它们之间存在差异。@kasper好的,这个答案差异很大,我更新了我的答案,以满足您的新要求,这不会太有竞争力,但您接受了这个答案,它是基于我对下面原始问题的解决方案,并且没有给我任何分数?做一个好的运动。@kojiro不幸的是,他天生就患有“西方最快的枪”综合症。我尽量做到公平,尽量减少这一点,但我也希望OP能及时得到一个有效的答案,编辑其他答案也会受到轻视(这是理所当然的)。@SiegeX这就是为什么提问者应该花时间接受答案的原因。当然,有人急于回答问题,但一定要急于勾选复选框吗?
    sed '\|\(.*\)\($/.*\)|!{s/.*/printf "%s\n" "&"/;b};s//printf "%-79s%s\n" "\1" "\2"/' params | sh
    
    sed '\|\(.*\)\($/.*\)|{s//printf "%-79s%s" "\1" "\2"/e}' params