除了空行外,每一行都用单引号括起来
Surround every line with single quote except empty lines
我的目标是向文件中的每一行添加一个撇号并跳过空行。
file.txt:
Quote1
Quote2
Quote3
到目前为止我已经使用了 sed:
sed -e "s/\(.*\)/''/"
执行此操作但也在空行中创建撇号:
'Quote1'
'Quote2'
''
'Quote3'
我的目标:
'Quote1'
'Quote2'
'Quote3'
我如何通过使用 sed 来实现这一点,或者它应该是 awk。
一种方式:
awk '{[=10=] = q [=10=] q}1' q="'" file
仅当第 1 列 (</code>) 具有一定价值时才添加引号。 <code>1
打印每一行。
.*
表示 zero or more characters
,您需要 1 or more characters
,这在任何 sed 中都是 ..*
:
$ sed "s/..*/'&'/" file
'Quote1'
'Quote2'
'Quote3'
您也可以在 GNU sed 中将该正则表达式写为 .\+
,在 POSIX seds 中写为 .\{1,\}
,在 GNU 中写为 .+
或 OSX/BSD sed 时用 -E
.
调用
以上假设所有空格的行都应该被引用。如果那是错误的那么:
$ sed "s/.*[^[:blank:]].*/'&'/" file
'Quote1'
'Quote2'
'Quote3'
在任何 awk 中假设所有空格的行都应该被引用:
$ awk '/./{[=12=]="7" [=12=] "7"}1' file
'Quote1'
'Quote2'
'Quote3'
否则:
$ awk 'NF{[=13=]="7" [=13=] "7"}1' file
'Quote1'
'Quote2'
'Quote3'
你可以看到上面的区别:
$ printf ' \n' | sed "s/..*/'&'/"
' '
$ printf ' \n' | sed "s/.*[^[:blank:]].*/'&'/"
$ printf ' \n' | awk '/./{[=14=]="7" [=14=] "7"}1'
' '
$ printf ' \n' | awk 'NF{[=14=]="7" [=14=] "7"}1'
$
假设您想将单引号添加到只包含空格的行中:
sed -E "/./s/(.*)/''/"
您可以使用 perl
来检查负向回顾,断言您不会匹配 "empty" 行:
perl -pe 's/(?<!$)(.*)/""/' file
另一种选择是在你的正则表达式中更具体,正如@edmorton 在他的回答中所建议的那样。
另一个sed
sed '/^$/!{s/^/\x27/;s/$/\x27/}' file
上面的脚本说
- 寻找空行 -
/^$/
- 模式。
- 对于那些不遵循上述模式的行(
!
),将开始(^
)和结束($
)替换为单引号(\x27
).
尝试过 gnu sed
sed -E "s/\S+/'&'/" file.txt
我的目标是向文件中的每一行添加一个撇号并跳过空行。
file.txt:
Quote1
Quote2
Quote3
到目前为止我已经使用了 sed:
sed -e "s/\(.*\)/''/"
执行此操作但也在空行中创建撇号:
'Quote1'
'Quote2'
''
'Quote3'
我的目标:
'Quote1'
'Quote2'
'Quote3'
我如何通过使用 sed 来实现这一点,或者它应该是 awk。
一种方式:
awk '{[=10=] = q [=10=] q}1' q="'" file
仅当第 1 列 (</code>) 具有一定价值时才添加引号。 <code>1
打印每一行。
.*
表示 zero or more characters
,您需要 1 or more characters
,这在任何 sed 中都是 ..*
:
$ sed "s/..*/'&'/" file
'Quote1'
'Quote2'
'Quote3'
您也可以在 GNU sed 中将该正则表达式写为 .\+
,在 POSIX seds 中写为 .\{1,\}
,在 GNU 中写为 .+
或 OSX/BSD sed 时用 -E
.
以上假设所有空格的行都应该被引用。如果那是错误的那么:
$ sed "s/.*[^[:blank:]].*/'&'/" file
'Quote1'
'Quote2'
'Quote3'
在任何 awk 中假设所有空格的行都应该被引用:
$ awk '/./{[=12=]="7" [=12=] "7"}1' file
'Quote1'
'Quote2'
'Quote3'
否则:
$ awk 'NF{[=13=]="7" [=13=] "7"}1' file
'Quote1'
'Quote2'
'Quote3'
你可以看到上面的区别:
$ printf ' \n' | sed "s/..*/'&'/"
' '
$ printf ' \n' | sed "s/.*[^[:blank:]].*/'&'/"
$ printf ' \n' | awk '/./{[=14=]="7" [=14=] "7"}1'
' '
$ printf ' \n' | awk 'NF{[=14=]="7" [=14=] "7"}1'
$
假设您想将单引号添加到只包含空格的行中:
sed -E "/./s/(.*)/''/"
您可以使用 perl
来检查负向回顾,断言您不会匹配 "empty" 行:
perl -pe 's/(?<!$)(.*)/""/' file
另一种选择是在你的正则表达式中更具体,正如@edmorton 在他的回答中所建议的那样。
另一个sed
sed '/^$/!{s/^/\x27/;s/$/\x27/}' file
上面的脚本说
- 寻找空行 -
/^$/
- 模式。 - 对于那些不遵循上述模式的行(
!
),将开始(^
)和结束($
)替换为单引号(\x27
).
尝试过 gnu sed
sed -E "s/\S+/'&'/" file.txt