Awk sed与其他文件内容内联
使用GNUAwk sed与其他文件内容内联,awk,sed,Awk,Sed,使用GNUsed我试图替换文件中的一行(其中可能有多个匹配项),同时保留其后面的空白 文件引用将包含路径 以下是原始文件(fileA)的示例: 下面是保存我要使用的内容的文件(fileB)的内容: keyword-here: value1 value2 value3 所需输出: key key2 key3 keyword-here: value1 value2 value3 key5 key6 keyword-here: value1
sed
我试图替换文件中的一行(其中可能有多个匹配项),同时保留其后面的空白
文件引用将包含路径
以下是原始文件(fileA
)的示例:
下面是保存我要使用的内容的文件(fileB
)的内容:
keyword-here: value1 value2 value3
所需输出:
key
key2
key3
keyword-here: value1 value2 value3
key5
key6
keyword-here: value1 value2 value3
key7
我一直在尝试使用以下内容,但它无法将空格保留在匹配关键字后面:
sed -e "/keyword-here:/r fileB" -e "/keyword-here:/d" fileA > fileOutput
理想情况下,我还可以直接在文件中进行更改(
fileA
)。将fileB的内容放入一个变量中,并使用替换命令替换以关键字开头的行部分
new=$(cat fileB)
sed "s/keyword-here:.*/$new/" fileA > fileOutput
将fileB的内容放入变量中,并使用substitute命令替换以关键字开头的行部分
new=$(cat fileB)
sed "s/keyword-here:.*/$new/" fileA > fileOutput
使用GNUsed
和bash
:
sed 's/keyword-here:.*/'"$(<"fileB")"'/' "fileA"
sed的/关键字:.*/'”$(使用GNUsed
和bash
:
sed 's/keyword-here:.*/'"$(<"fileB")"'/' "fileA"
sed's/这里的关键字:.*/'”$(使用GNU:(-i就地开关,像sed-i
一样就地更换)
使用GNU:(-i就地
开关,就地更换,如sed-i
)
我喜欢使用ed
而不是sed
来进行文件的就地编辑-它从一开始就设计好了,并且没有非标准sed-I
的一些可移植性问题。它只接受来自标准输入的命令,所以在脚本中使用它的简单方法是使用管道printf
对于简单的情况输出到它,对于像这样更复杂的情况输出到它
这一系列的ed
命令在此处查找包含关键字的每一行:
,然后为每一行:将其拆分为三行,关键字前的所有内容、伪行和关键字后的所有内容(如任何尾随空格)。然后,它删除虚拟行并将其替换为文件b
的内容,并将前一行、新行和后一行合并为一行。最后,它保存文件
ed -s fileA <<'EOF'
g/keyword-here:/s/keyword-here:/\
dummy\
/\
-2 ka\
-1 d\
-1 r fileB\
'a,+1 j
w
q
EOF
(我用下划线替换了尾随空格字符,以便于演示和测试)我非常喜欢使用ed
而不是sed
来进行文件的就地编辑-它从一开始就设计好了,没有非标准sed-I
的一些可移植性问题。它只接受来自标准输入的命令,所以在脚本中使用它的简单方法是使用管道>printf
对于简单的情况输出到它,对于像这样更复杂的情况输出到它
这一系列的ed
命令在此处查找包含关键字的每一行:
,然后为每一行:将其拆分为三行,关键字前的所有内容、伪行和关键字后的所有内容(如任何尾随空格)。然后,它删除虚拟行并将其替换为文件b
的内容,并将前一行、新行和后一行合并为一行。最后,它保存文件
ed -s fileA <<'EOF'
g/keyword-here:/s/keyword-here:/\
dummy\
/\
-2 ka\
-1 d\
-1 r fileB\
'a,+1 j
w
q
EOF
(为了便于演示和测试,我用下划线替换了尾随空格字符)这将适用于fileB中的任何字符串,因为它使用文字字符串替换,并且不需要硬编码关键字,因为它已经存在于fileB中:
gawk -i inplace -F':' '
NR==FNR { kw=$1; new=$0 }
NR>FNR && s=index($0,kw FS) { $0=substr($0,1,s-1) new }
1' fileB fileA
这将适用于fileB中的任何字符串,因为它使用文字字符串替换,并且不需要硬编码关键字,因为它已经存在于fileB中:
gawk -i inplace -F':' '
NR==FNR { kw=$1; new=$0 }
NR>FNR && s=index($0,kw FS) { $0=substr($0,1,s-1) new }
1' fileB fileA
这可能适用于您(GNU-sed):
将文件2复制到保留空间
将file2追加到file1的每一行
匹配关键字并删除从原始关键字到匹配项的所有内容,只打印文件2中匹配行上的内容。因此保留行前面的原始空白,并按原样打印所有不匹配的行
注意:这还允许在文件2中使用其他匹配关键字。这可能适用于您(GNU-sed):
将文件2复制到保留空间
将file2追加到file1的每一行
匹配关键字并删除从原始关键字到匹配项的所有内容,只打印文件2中匹配行上的内容。因此保留行前面的原始空白,并按原样打印所有不匹配的行
注意:这还允许在文件2中使用其他匹配关键字。忘记提及文件中提到的路径。因此,我不知道s的选项。我将更新我的原始问题以提及路径要求。是否有可能将其更改为与提供给文件B的路径中的斜杠兼容?@t988GF如果fileB
实际上是/foo/bar/fileB
,不会导致此代码出现错误。如果文件的内容包含斜杠,现在…(请参阅我的答案,了解与该场景没有问题的方法)。您还需要从RE中删除*
,否则它会占用后面的空格。@t988GF只需添加引号——请参阅修订后的代码,该代码应与“文件A”和“文件B”(文件名中的空格等)兼容.Still get-sed:-e expression#1,char 48:未知选项为's'。我正在尝试使用带有路径的文件,如:/root/folder/fileAforgot以提及该文件带有路径。因此,我将未知选项为s。我将更新原始问题以提及路径要求。是否有可能将其更改为与斜杠兼容如果fileB
实际上是/foo/bar/fileB
,则不会导致此代码错误。如果文件内容包含斜杠,现在…(请参阅我的答案,了解该方案没有问题的方法)。您还希望删除*
f