Bash 使用sed或awk的行的单引号部分
使用Bash 使用sed或awk的行的单引号部分,bash,awk,sed,Bash,Awk,Sed,使用sed或awk按如下方式转换输入文本: awk '{ printf "%s '"'"'", $1; for (i=2; i<NF; ++i) printf "%s ", $i; print $NF "'"'"'" }' file 输入文件: 113259740 QA Test in progress 219919630 UAT Test in progress 预期产出: 113259740 'QA Test in progress'
sed
或awk
按如下方式转换输入文本:
awk '{ printf "%s '"'"'", $1; for (i=2; i<NF; ++i) printf "%s ", $i; print $NF "'"'"'" }' file
输入文件:
113259740 QA Test in progress
219919630 UAT Test in progress
预期产出:
113259740 'QA Test in progress'
219919630 'UAT Test in progress'
您可以通过利用bash等大多数shell中涉及的单词拆分来执行此操作。为了避免最终结果中出现额外的单引号,您可以使用sed将其删除。这也将修剪i之前、i和j之间以及j之后的任何额外空间
cat file.txt | sed“s/'//g”|同时读取i j;做回显“$i'$j'”;完成
在这里,我们将第一个单词导入变量i,其余的导入变量j。您可以利用bash等大多数shell中涉及的单词拆分来执行此操作。为了避免最终结果中出现额外的单引号,您可以使用sed将其删除。这也将修剪i之前、i和j之间以及j之后的任何额外空间
cat file.txt | sed“s/'//g”|同时读取i j;做回显“$i'$j'”;完成
在这里,我们将使用GNU
sed
或BSD(OSX)sed
将第一个单词导入变量i,其余单词导入j.:
sed -E "s/^( *)([^ ]+)( +)(.*)$/\1\2\3'\4'/" file
捕获所有前导空格(如果有)^(*)
捕获第一个字段(长度至少为1的一行非空格字符)([^]+)
捕获第一个字段后的空格(+)
匹配行的其余部分,不管它是什么(.*)$
用捕获的前导空格替换每个(匹配的)输入行,后跟第一个字段,后跟捕获的第一个字段间空格,后跟输入行的单引号剩余部分。要放弃前导空格,只需省略\1\2\3'\4'
\1
- 匹配第1个字段比严格要求更为宽松,因为它匹配任何非空格字符序列,而不仅仅是数字(如示例输入数据中所示)
- 支持其他形式的空白(如制表符)的通用解决方案(包括第一个字段之后)如下所示:
sed -E "s/^([[:space:]]*)([^[:space:]]+)([[:space:]]+)(.*)$/\1\2\3'\4'/" file
如果您的
sed
版本不支持-E
(或-r
)以启用对扩展正则表达式的支持,请尝试使用基本正则表达式的以下兼容POSIX的变体:
使用GNU
sed
或BSD(OSX)sed
:
sed -E "s/^( *)([^ ]+)( +)(.*)$/\1\2\3'\4'/" file
捕获所有前导空格(如果有)^(*)
捕获第一个字段(长度至少为1的一行非空格字符)([^]+)
捕获第一个字段后的空格(+)
匹配行的其余部分,不管它是什么(.*)$
用捕获的前导空格替换每个(匹配的)输入行,后跟第一个字段,后跟捕获的第一个字段间空格,后跟输入行的单引号剩余部分。要放弃前导空格,只需省略\1\2\3'\4'
\1
- 匹配第1个字段比严格要求更为宽松,因为它匹配任何非空格字符序列,而不仅仅是数字(如示例输入数据中所示)
- 支持其他形式的空白(如制表符)的通用解决方案(包括第一个字段之后)如下所示:
sed -E "s/^([[:space:]]*)([^[:space:]]+)([[:space:]]+)(.*)$/\1\2\3'\4'/" file
如果您的
sed
版本不支持-E
(或-r
)以启用对扩展正则表达式的支持,请尝试使用基本正则表达式的以下兼容POSIX的变体:
在
awk
中:
awk '{ printf "%s '"'"'", $1; for (i=2; i<NF; ++i) printf "%s ", $i; print $NF "'"'"'" }' file
在
awk
中:
awk '{ printf "%s '"'"'", $1; for (i=2; i<NF; ++i) printf "%s ", $i; print $NF "'"'"'" }' file
您也可以尝试这个GNU
sed
命令
sed -r "s/^( +) ([0-9]+) (.*)$/\1 \2 '\3'/g" file
,在开始处捕获一个或多个空格并将其存储在组中(1)^(+)
-在开始时捕捉到一个或多个空格后,接下来它将匹配其后的一个空格,并获取该空格旁边的所有数字,然后将其存储在一个组中(2)([0-9]+)
-获取数字旁边直到最后一个字符的所有字符,然后将其存储在一个组(3)中(.*)$
- 根据所需的输出,在替换部件中重新排列所有提取的组
$ cat ccc
113259740 QA Test in progress
219919630 UAT Test in progress
$ sed -r "s/^( +) ([0-9]+) (.*)$/\1 \2 '\3'/g" ccc
113259740 'QA Test in progress'
219919630 'UAT Test in progress'
您也可以尝试这个GNU
sed
命令
sed -r "s/^( +) ([0-9]+) (.*)$/\1 \2 '\3'/g" file
,在开始处捕获一个或多个空格并将其存储在组中(1)^(+)
-在开始时捕捉到一个或多个空格后,接下来它将匹配其后的一个空格,并获取该空格旁边的所有数字,然后将其存储在一个组中(2)([0-9]+)
-获取数字旁边直到最后一个字符的所有字符,然后将其存储在一个组(3)中(.*)$
- 根据所需的输出,在替换部件中重新排列所有提取的组
$ cat ccc
113259740 QA Test in progress
219919630 UAT Test in progress
$ sed -r "s/^( +) ([0-9]+) (.*)$/\1 \2 '\3'/g" ccc
113259740 'QA Test in progress'
219919630 'UAT Test in progress'
awk
解决方案:
awk -v q="'" '{ f1=$1; $1=""; print f1, q substr($0,2) q }' file
- 允许
按空格将每个输入行拆分为字段(默认行为)awk
定义了包含单引号的awk变量-v q=“”
,以便更容易在作为一个整体的单引号的awk程序中使用单引号q
保存第一个字段供以后使用f1=$1
有效地删除了输入行中的第一个字段,留下最初引用整个输入行的$1==”
,其中包含一个空格,后跟行的其余部分(严格来说,使用输出字段分隔符OFS重新连接字段,该分隔符默认为空格;由于第一个字段现在为空,因此生成的$0
以一个空格开始,后面是所有剩余字段,每个字段用空格分隔)$0
然后打印保存的第一个字段,后跟一个空格(打印f1,q substr($0,2)q
)OFS