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#
说明:
$/…
$/…
$/…
字符串添加到行的末尾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