Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sed复制和修改bash中的单词_Bash_Awk_Sed - Fatal编程技术网

使用sed复制和修改bash中的单词

使用sed复制和修改bash中的单词,bash,awk,sed,Bash,Awk,Sed,我使用Linux操作系统。我在bash脚本中有一个文件要修改 我的原始文件如下: ... ERIC-1898 HELENE-5456 THOMAS-54565 IRON-06516 ... ... "ERIC-1898" "ERIC-SYSTEM-1898" "HELENE-5456" "HELENE-SYSTEM-5456" "THOMAS-54565" "THOMAS-SYSTEM-54565" "IRON-06516" "IRON-SYSTEM-06516" ... 我想用重复的单词

我使用Linux操作系统。我在bash脚本中有一个文件要修改

我的原始文件如下:

...
ERIC-1898
HELENE-5456
THOMAS-54565
IRON-06516
...
...
"ERIC-1898" "ERIC-SYSTEM-1898" 
"HELENE-5456" "HELENE-SYSTEM-5456"
"THOMAS-54565" "THOMAS-SYSTEM-54565"
"IRON-06516" "IRON-SYSTEM-06516"
...
我想用重复的单词(以及第二个字段中的
-SYSTEM-
word)修改这个文件,并添加双引号。 因此,结果必须是这样的:

...
ERIC-1898
HELENE-5456
THOMAS-54565
IRON-06516
...
...
"ERIC-1898" "ERIC-SYSTEM-1898" 
"HELENE-5456" "HELENE-SYSTEM-5456"
"THOMAS-54565" "THOMAS-SYSTEM-54565"
"IRON-06516" "IRON-SYSTEM-06516"
...
我如何才能做到这一点,例如使用sed?

awk解决方案:

awk -F'-' '{printf("\"%s\" \"%s-SYSTEM-%s\"\n", $1FS$2,$1,$2)}' file
输出如下所示:

"ERIC-1898" "ERIC-SYSTEM-1898"
"HELENE-5456" "HELENE-SYSTEM-5456"
"THOMAS-54565" "THOMAS-SYSTEM-54565"
"IRON-06516" "IRON-SYSTEM-06516"

使用sed和两个捕获组:

$ sed 's/\(.*-\)\(.*\)/"&" "\1SYSTEM-\2"/' infile
"ERIC-1898" "ERIC-SYSTEM-1898"
"HELENE-5456" "HELENE-SYSTEM-5456"
"THOMAS-54565" "THOMAS-SYSTEM-54565"
"IRON-06516" "IRON-SYSTEM-06516"

假设每个输入行正好有一个连字符。

不使用外部程序:

#!/bin/bash

IFS=$'-'
while read -r first second;do
    echo "\"$first-$second\" \"$first-SYSTEM-$second\""
done <infile
#/bin/bash
IFS=$'-'
而read-r是第一秒;做
回显“\”$first-$second\“\”$first SYSTEM-$second\”

完成
sed-E的/(.*)-(.*)/“&”\1-SYSTEM-\2/“
?是的,它也可以工作:-)谢谢,伙计!!您可以使
IFS
成为循环的一部分,而不是全局更改它:
而IFS='-'先读取-r;执行