使用sed进行文件格式化



我一直在尝试操作文件中的一行,但没有成功。

用法

10.20.30.40 "User 1"
73.15.16.24 NewUser
124.18.21.17 "User 2"
27.76.58.248 "User 3"
39.16.87.227 "User 4"
211.129.20.52 "User 5"
175.15.118.110 "User 6"

如果你注意到第二行最后一个单词没有引号。我一直在试图找出一种方法,把引号周围,并保存它,要么在另一个文件,或者最好在原来的。

当我使用这个命令时:

cat test.txt | grep -v '".*"' | sed -i 's/([A-Z])/"1/g'

它找到了正确的行,并在单词的开头加了一个引号,但在U之前又加了一个引号,这不是我需要的。当然,我总是可以使用sed在最后一个位置放置一个引号,但是包含整个单词就更好了。

如果我随后使用sed命令和-i并将其指向原始文件,那么保存时它会在每个单词周围加上引号,这也是我不想要的。

任何帮助都是感激的,我已经试着解决这个问题好几天了

可以使用

sed -E 's/^([0-9]+(.[0-9]+){3})[[:space:]]+([^[:space:]"]+)$/1 "3"/' file > newfile

使用GNU sed:

sed -i -E 's/^([0-9]+(.[0-9]+){3})s+([^[:space:]"]+)$/1 "3"/' file

细节:

  • ^-字符串
  • 起始
  • ([0-9]+(.[0-9]+){3})-一个或多个数字,然后出现3次.和一个或多个数字
  • [[:space:]]+-一个或多个空白
  • ([^[:space:]"]+)-组3:除"和空格以外的一个或多个字符
  • $-字符串结束

查看在线演示:

#!/bin/bash
s='10.20.30.40 "User 1"
73.15.16.24 NewUser
124.18.21.17 "User 2"
27.76.58.248 "User 3"
39.16.87.227 "User 4"
211.129.20.52 "User 5"
175.15.118.110 "User 6"'
sed -E 's/^([0-9]+(.[0-9]+){3})[[:space:]]+([^[:space:]"]+)$/1 "3"/' <<< "$s"

输出:

10.20.30.40 "User 1"
73.15.16.24 "NewUser"
124.18.21.17 "User 2"
27.76.58.248 "User 3"
39.16.87.227 "User 4"
211.129.20.52 "User 5"
175.15.118.110 "User 6"

一个纯bash解决方案,它可能比sed:

更容易阅读和维护。
#!/bin/bash
# read each line of the file into an array
while read -ra line ; do
# "user" is everything after the first token in the line
user="${line[*]:1}"
# if user isn't surrounded by quotes then add them,
# otherwise just print the line verbatim
if [[ "${user}" != "*" ]] ; then
echo "${line[0]} "${user}""
else
echo "${line[@]}"
fi
done < test.txt > test.txt.new
# Put the edited file back in place over top of
# the original file. Start off commented in case
# you want to diff before overwriting the original.
# mv test.txt.new test.txt

使用sed

$ sed -i.bak '/"/!{s/[[:alpha:]]+( S+)?$/"&"/}' input_file
10.20.30.40 "User 1"
73.15.16.24 "NewUser"
124.18.21.17 "User 2"
27.76.58.248 "User 3"
39.16.87.227 "User 4"
211.129.20.52 "User 5"
175.15.118.110 "User 6"

-i将允许您保存您的文件在适当的

.bak将创建一个带有.bak扩展名的原始备份

Using awk:

awk '{print (NR==2) ?  $1 " "" $2 """ : $0}' inputfile

输出:

10.20.30.40 "User 1"
73.15.16.24 "NewUser"
124.18.21.17 "User 2"
27.76.58.248 "User 3"
39.16.87.227 "User 4"
211.129.20.52 "User 5"
175.15.118.110 "User 6"

或者使用regex更通用一点:

awk '{ print ($2 ~ /"*"/) ? $0 : $1 " "" $2 """}' t.dat

输出:

10.20.30.40 "User 1"
73.15.16.24 "NewUser"
124.18.21.17 "User 2"
27.76.58.248 "User 3"
39.16.87.227 "User 4"
211.129.20.52 "User 5"
175.15.118.110 "User 6"

使用GNU awk(取决于版本),您也可以就地编辑

最新更新