Awk sed与其他文件内容内联

Awk 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

使用GNU
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
使用GNU
sed
bash

sed 's/keyword-here:.*/'"$(<"fileB")"'/' "fileA"
sed的/关键字:.*/'”$(使用GNU
sed
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