除空行外,每行都用单引号引起来

时间:2019-04-22 14:49:01

标签: unix awk sed text-processing

我的目标是在文件的每一行中添加一个单引号,并跳过空行。

file.txt

Quote1
Quote2

Quote3

到目前为止,我已使用sed:

sed -e "s/\(.*\)/'\1'/"

既可以执行此操作,又可以在空行中创建撇号:

'Quote1'
'Quote2'
''
'Quote3'

我的目标:

'Quote1'
'Quote2'

'Quote3'

我如何通过使用sed来实现这一目标,或者它应该是awk。

6 个答案:

答案 0 :(得分:6)

.*的意思是zero or more characters,您希望1 or more characters在任何sed中都是..*

$ sed "s/..*/'&'/" file
'Quote1'
'Quote2'

'Quote3'

在使用.\+调用时,您还可以在GNU sed中将正则表达式写为.\{1,\},在POSIX sed中将.+写成,在GNU或OSX / BSD sed中将-E写成。

以上假设所有空白行均应加引号。如果那是错误的,那么:

$ sed "s/.*[^[:blank:]].*/'&'/" file
'Quote1'
'Quote2'

'Quote3'

在任何awk中,假设所有空白行都应加引号:

$ awk '/./{$0="\047" $0 "\047"}1' file
'Quote1'
'Quote2'

'Quote3'

否则:

$ awk 'NF{$0="\047" $0 "\047"}1' file
'Quote1'
'Quote2'

'Quote3'

您可以看到以上内容之间的区别:

$ printf '   \n' | sed "s/..*/'&'/"
'   '
$ printf '   \n' | sed "s/.*[^[:blank:]].*/'&'/"

$ printf '   \n' | awk '/./{$0="\047" $0 "\047"}1'
'   '
$ printf '   \n' | awk 'NF{$0="\047" $0 "\047"}1'

$

答案 1 :(得分:1)

一种方法:

awk '$1{$0 = q $0 q}1' q="'" file

仅在第一列($1)具有某些值时才添加引号。 1打印每一行。

答案 2 :(得分:1)

假设您要将单引号添加到除空格外仅包含以下行的行:

sed -E "/./s/(.*)/'\1'/"

答案 3 :(得分:1)

另一个sed

sed '/^$/!{s/^/\x27/;s/$/\x27/}' file

上面的脚本说

  • 寻找空行-/^$/-模式。
  • 对于不遵循上述模式(!)的行,请用单引号(^)替换start($)和end(\x27) 。

答案 4 :(得分:0)

您可以使用perl来检查后面是否有否定字眼,断言您将不匹配“空”行:

perl -pe 's/(?<!$)(.*)/"\1"/' file

另一种选择是在正则表达式中更具体,如@edmorton在他的回答中建议的那样。

答案 5 :(得分:0)

在gnu sed上尝试

sed -E "s/\S+/'&'/" file.txt