在不包含字符串的文件中查找行,并在其开头添加文本



我在一个文件中有以下格式的数据。

name,path:A:B
loc:D
name,for:B:C

我需要添加"(空格+逗号(在所有没有的行的开头,在文件中,以获得如下输出。

name,path:A:B
,loc:D
name,for:B:C

grep "[^,]" file。。这给了我一个不包含的行列表,但我无法在开头添加。

请您尝试以下内容,用GNUawk中显示的示例编写和测试。

awk '!/,/{print OFS","$0;next} 1' Input_file

解释:添加以上详细解释。

awk '               ##Starting awk program from here.
!/,/{               ##Checking condition if line is NOT having comma then do following.
print OFS","$0    ##Printing OFS comma and current line here.
next              ##next will skip all further statements from here.
}
1                   ##1 will print current line here.
' Input_file        ##Mentioning Input_file name here.

grep不是这里的工具,我会使用awk或sed。使用awk:

$ awk '
BEGIN {
FS=OFS=","  # set delimiters to ,
}
NF==1 {         # if there is only one field (consider NF<=1 for ampty records)
$1=OFS $1   # add a delimiter in front of it
}
1' file         # output

输出:

name,path:A:B
,loc:D
name,for:B:C

使用sed:

sed -r '/,/!s/(^.*$)/ ,1/' file

使用搜索没有逗号的行!然后将整行替换为空格、逗号和现有行。

我将使用GNUAWK执行以下任务,让file.txt内容为

name,path:A:B
loc:D
name,for:B:C

然后

awk '{print /,/?$0:" ,"$0}' file.txt

输出

name,path:A:B
,loc:D
name,for:B:C

说明:对于每一行,如果有,,则只有print那一行($0(,否则是print空格逗号(" ,"(和那一行的串联($0(。

(在gawk 4.2.1中测试(

您可以使用index来检查逗号。

awk '{print index($0, ",") ? $0 : " ," $0}' file

输出

name,path:A:B
,loc:D
name,for:B:C

这里有很多使用sedawk的好答案,它们完全可以做到这一点(甚至比下面的更好(。但有趣的是,这里有一个仅限bash的解决方案(无需调用grep等外部程序(,它也能起到作用:

$ while read -r; do p=""; [[ ! $REPLY =~ [^,]*,[^,]* ]] && p=" ,"; echo "${p}${REPLY}"; done < test.txt 
name,path:A:B
,loc:D
name,for:B:C

解释版本:

#!/bin/bash
while read -r; do # looping over a file the right way in bash
p="" # initializing a prefix
[[ ! $REPLY =~ [^,]*,[^,]* ]] && p=" ," # if the line doesn't contain a comma, the prefix will contain a comma
echo "${p}${REPLY}"; # print the line with the prefix which can be blank or not
done < test.txt 

要编辑文件本身,请使用ed:

printf "%sn" "v/,/s/^/ ,/" w | ed -s file

在没有逗号的每一行的开头插入一个空格和逗号,然后保存修改后的文件。

相关内容

  • 没有找到相关文章

最新更新