我一直在尝试操作文件中的一行,但没有成功。
用法
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(取决于版本),您也可以就地编辑