如何在文本文件中剪切和粘贴单词以将其移动到多行同一行中的第三个单词

时间:2019-04-23 07:30:53

标签: bash

我有一个从网站复制并粘贴的文本文件 不幸的是,该格式有点乱码,因为它会将单词放置在错​​误的地方,我无法将其剪切并简单地粘贴到所需的格式中。我有大约500行这样的代码!每行要花大约1分钟-2分钟才能剪切并粘贴正确的格式。所以我要完成的工作就是削减这样的IP地址和子网掩码格式

192.168.12.0/255.255.255.0

并将其翻译为此

192.168.12.0 /24 # <---notice with space there..

例如,这是代码行:

address-object ipv4 192.168.12.0 192.168.12.0/255.255.255.0 Network IPv4    

它应该像这样:

address-object ipv4 192.168.12.0 Network 192.168.12.0 /24 zone LAN  

因此,所做的更改是我必须将“网络”一词剪切并粘贴到代码中的第4个字符串上,并将子网掩码更改为斜杠前缀,然后将字符串区域LAN添加到末尾 任何好的建议,我如何可以完成这样的任务? 我以为sed可以工作,但不知道

的语法

我已经使用sed修改了一些代码,但其余部分却卡住了

sed -i -e 's/^.............../ipv4/' config1.txt

3 个答案:

答案 0 :(得分:1)

一种方法:

$ cat file
address-object ipv4 192.168.12.0 192.168.12.0/255.255.255.0 Network IPv4
$
$ awk '{$4= $(NF-1) FS $4; $(NF-1)="zone"; $NF="LAN"}1' file | sed -r 's^([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}^\1 /24^'
address-object ipv4 192.168.12.0 Network 192.168.12.0 /24 zone LAN

使用awk,将“网络”移到第4列之前,并用“区域”和“ LAN”替换最后两列。使用sed,将ip addr / subnet替换为24。

答案 1 :(得分:0)

您可以单独使用awk并使用'/'的字段分隔符,然后将所得的$1$2分成数组以将输出放在一起,例如

awk -F'/' '{
    split ($1, a, " ")
    split ($2, b, " ")
    printf "%s %s %s %s %s %s\n", a[1], a[2], a[3], b[2], a[4], "/24 zone LAN"
}' file

使用/输出示例

将数据保存在file中,只需在终端中复制/粘贴以上内容即可:

$ awk -F'/' '{
>     split ($1, a, " ")
>     split ($2, b, " ")
>     printf "%s %s %s %s %s %s\n", a[1], a[2], a[3], b[2], a[4], "/24 zone LAN"
> }' file
address-object ipv4 192.168.12.0 Network 192.168.12.0 /24 zone LAN

答案 2 :(得分:0)

sed仅解决方案

sed -E 's@(\S+ \S+ \S+) (\S+)/(\S+) (\S+) .*@\1 \4 \2 /24 zone LAN@' config1.txt

例如:

Input : address-object ipv4 192.168.12.0 192.168.12.0/255.255.255.0 Network IPv4
Match : (\S+           \S+  \S+        ) (\S+)       /(\S+)         (\S+)   .*

Output: address-object ipv4 192.168.12.0 Network 192.168.12.0 /24 zone LAN

这假设每一行的格式都完全相同(字数相同)。因此,完整的单词由\S+捕获。如果没有,则应根据需要对模式进行进一步的专门化。

-E不是POSIX标准,即在某些平台上可能无法使用。