仅当该文件中尚不存在此内容时,才将此处的文档内容附加到文件中

仅当该文件中尚不存在此内容时,才将此处的文档内容附加到文件中

我有一个文件,我想向其中附加一些内容(包括下面代码中可见的第一个、第二个和第三个空格):

### 我是文本 1

### 我是文本 2

(我附加的实际文本比这 5 行长得多)。

为了简单地将内容附加到文件中,我这样做:

cat <<-"EOF" >> myPath/myFile
    content...
EOF

但是,我如何确保仅当文件中尚不存在该内容时,heredocument 才会附加该内容,否则操作将被中止?

如果文件中仅存在部分块内容,则整个操作也应中止。

答案1

如果仅在不存在此处文档的情况下添加此处文档,则可以使用grep

cat <<-"EOF1" > myPath/myFile.append
    content...
EOF1
if ! grep -F -q -f myPath/myFile{.append,}; then
    cat myPath/myFile.append >> myPath/myFile
fi

要理解这一点,请考虑以下内容。

  • grep -F -q -f myPath/myFile{.append,}由 shell 扩展为grep -F -q -f myPath/myFile.append myPath/myFile.

  • grep命令搜索myPath/myFile(如有必要,应添加文本的文件)-F包含在myPath/myFile.append(包含要添加的文本的文件)中的任何固定字符串 ( ),每行读取一个模式 ( -f),并仅通过以下方式指示是否找到任何固定字符串( ):它是退出代码,没有输出 ( -q)。

  • 然后将结果取反!,以便仅在找不到任何内容时才运行该if块的部分。thengrep

答案2

请不要点赞这个答案,但斯蒂芬的答案我已标记为正确。这只是一个对我来说更容易阅读的变体。


如果模板文件的内容仅应附加到最终文件(如果最终文件中尚不存在),则可以使用grep

cat <<-"EOF1" > myPath/myTemplate
    content...
EOF1

if ! grep -F -q -f myPath/myFile myPath/myTemplate; then
    cat myPath/myTemplate >> myPath/myFile
fi

grep命令搜索中包含的myPath/endFile.sh任何固定字符串 ( -F) myPath/myTemplate,每行 ( -f) 读取一个模式,并仅通过其退出代码,没有输出 ( -q)。

然后结果被取反!,这样只有在与最终文件中的任何内容都不匹配时才会执行then该块的块。if-thengrep

附录 - 退出代码:

当进程退出时,它会返回一个退出代码,这是一个小整数。按照约定,退出代码 0 表示成功,非零表示失败或错误:

  • grep找到匹配项时返回 0,未找到匹配项时返回 1。

  • if使用其参数的退出代码来决定要做什么;如果为 0,则处理该then块,否则处理该else块(如果有)。

  • 标点符号 ( !) 可以翻转;该then块仅在 grep 不匹配任何内容(或遇到错误)时运行。

相关内容