在开始时我们需要检查连字符之前是否有2个或3个字符,然后应保留为其和if 连字符前面的字符(如果有的话)是1或大于3,那么我们就可以在连字符后加上空格
输入
SB-743921- 11C
SBDF-559448-AAA
SBI-742457-A
S-SANJAY PFF
GH222016/Love
输出
SB-743921- 11C
SBDF- 559448-AAA
SBI-742457-A
S- SANJAY PFF
GH222016/Love
我正在尝试使用像
这样的tr命令cat input.txt|tr "...?-" " "
但它正在替换所有 - 空格
答案 0 :(得分:2)
试试这个:
awk -F- -v OFS="-" '{for(i=NF-1;i>=1;i--){l=length($i);if(l<2||l>3)$(i+1)=" "$(i+1)}}7' file
以上一行适用于每个 -
的规则:例如:
kent$ cat f
SB-743921- 11C
SBDF-559448-AAA
SBI-742457-A
S-SANJAY PFF
GH222016/Love
kent$ awk -F- -v OFS="-" '{for(i=NF-1;i>=1;i--){l=length($i);if(l<2||l>3)$(i+1)=" "$(i+1)}}7' f
SB-743921- 11C
SBDF- 559448- AAA
SBI-742457- A
S- SANJAY PFF
GH222016/Love
如果您只想在第一个-
之前检查该列,则会更容易。
awk -F- -v OFS="-" 'NF>1{l=length($1);if(l<2||l>3)$2=" "$2}7' file
答案 1 :(得分:0)
tr
tr 将一个字符与另一个字符联系起来。您可能需要使用具有更强大的正则表达式引擎的工具:
perl -pe 's/-/- /g; s/- (\w\w\w?)\b/-$1/g;' <input.txt
这会在连字符后的到处中放置一个空格,然后在你不想要的情况下删除它。
答案 2 :(得分:0)
sed
可能最简单:
sed -E 's/^([^-]|[^-]{4,})-/\1- /' input.txt
总体效果是在第一个-
之前的第-
行之后插入空格,而第一个sed
之前没有正好2或3个字符。
-E
使用正则表达式来匹配输入行; sed
(GNU -r
中的别名:sed
)使s/<to replace>/<with what>/
支持扩展正则表达式(而不是默认的 basic
sed
是^
文本替换(文本替换)命令。[^-]
可确保匹配从每行的开头开始。-
表示:任何字符除 a [^-]|[^-]{4,}
。-
表示:匹配 单个字符而不是|
或(-
)除(...)
\1
,即所谓的捕获组,会导致与所包含表达式匹配的字符串被保存(捕获)以供日后使用。\1-
(所谓的反向引用,这里指的是 1st (且仅限)捕获组)。使用-
作为替换字符串可以有效地在第一个sed
之后添加一个空格。